Xamarin Forms — CustomRenderer не работает после перехода

#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;
}