#c# #ios #xamarin #xamarin.forms #xamarin.ios
#c# #iOS #xamarin #xamarin.forms #xamarin.ios
Вопрос:
У меня есть пользовательский рендерер в моем собственном коде iOS для моей главной страницы. Он отлично работает при запуске приложения и отображает элементы навигационной панели с использованием системных значков iOS, чего я и хочу. Однако, если я уйду с главной страницы, при переходе назад RightBarButtonItems
массив содержит только два не созданных объекта, я ввожу проверку ( RightNavItems.Title == null
), чтобы продолжить, когда это имело место, чтобы посмотреть, что произойдет, и действительно, элементы не отображаются, если я уйду и вернусь снова, приложение вылетит, поскольку RightBarButtonItems
массив теперь пуст.
Почему элементы панели инструментов неинициализируются при переходе обратно на главную страницу? Как правильно обращаться с навигацией в пользовательском средстве визуализации, подобном этому?
Вот код для пользовательского средства визуализации:
public class ItemsPageRenderer : PageRenderer
{
public new ItemsPage Element
{
get { return (ItemsPage)base.Element; }
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
var rightNavList = new List<UIBarButtonItem>();
var navigationItem = this.NavigationController.TopViewController.NavigationItem;
for (var i = 0; i < Element.ToolbarItems.Count; i )
{
var reorder = (Element.ToolbarItems.Count - 1);
var ItemPriority = Element.ToolbarItems[reorder - i].Priority;
UIBarButtonItem RightNavItems = navigationItem.RightBarButtonItems[i];
if (RightNavItems.Title == null)
continue;
if (RightNavItems.Title.ToLower() == "add")
{
rightNavList.Add(new UIBarButtonItem(UIBarButtonSystemItem.Add)
{
Action = RightNavItems.Action,
Target = RightNavItems.Target
});
}
else if (RightNavItems.Title.ToLower() == "edit")
{
rightNavList.Add(new UIBarButtonItem(UIBarButtonSystemItem.Edit)
{
Action = RightNavItems.Action,
Target = RightNavItems.Target
});
}
else
{
rightNavList.Add(RightNavItems);
}
}
navigationItem.SetRightBarButtonItems(rightNavList.ToArray(), false);
}
}
Комментарии:
1. Когда вы говорите «пользовательский рендерер», является ли это реальным средством визуализации форм представления? Т.Е. вы показываете
ViewWillAppear
контроллер представления….2. @SushiHangover это расширение класса PageRenderer. Я отредактировал, чтобы включить полный класс.
3. Можете ли вы предоставить образец, чтобы я мог протестировать его на своей стороне.
4. @LucasZhang-MSFT Я создал пример с использованием шаблона Xamarin, который демонстрирует такое же поведение: icloud.com/iclouddrive/0DfTqRedqa_RytZ_VL-n5rFUQ#Example
5. Хорошо, я проверю это
Ответ №1:
Проверьте этот фрагмент кода
var rightNavList = new List<UIBarButtonItem>();
var navigationItem = this.NavigationController.TopViewController.NavigationItem;
for (var i = 0; i < Element.ToolbarItems.Count; i )
{
var reorder = (Element.ToolbarItems.Count - 1);
var ItemPriority = Element.ToolbarItems[reorder - i].Priority;
UIBarButtonItem RightNavItems = navigationItem.RightBarButtonItems[i];
if (RightNavItems.Title == null)
continue;
if (RightNavItems.Title.ToLower() == "add")
{
rightNavList.Add(new UIBarButtonItem(UIBarButtonSystemItem.Add)
{
Action = RightNavItems.Action,
Target = RightNavItems.Target
});
}
else if (RightNavItems.Title.ToLower() == "edit")
{
rightNavList.Add(new UIBarButtonItem(UIBarButtonSystemItem.Edit)
{
Action = RightNavItems.Action,
Target = RightNavItems.Target
});
}
else
{
rightNavList.Add(RightNavItems);
}
}
navigationItem.SetRightBarButtonItems(rightNavList.ToArray(), false);
При первом входе на страницу вы меняете внешний вид элемента с title
на icon
, однако при втором входе на страницу условие RightNavItems.Title == null
выполняется, поэтому цикл завершается без добавления какого-либо элемента в список, поэтому navigationItem.SetRightBarButtonItems
добавьте, наконец, массив null.
Решение
Измените, как показано ниже
if (RightNavItems.Title == null)
{
rightNavList.Add(RightNavItems); //add this line.
continue;
}