Xamarin Forms iOS Renderer - Стандартные значки ToolBar

Я могу создать простую вкладку Renderer, которая обновит мои Forms ToolBarItems, чтобы использовать встроенные значки iOS, как показано ниже.

NavigationController только NOT NULL в ViewWillAppear Если я попробую его в ViewDidLoad, это NULL.

Проблема с этим заключается в том, что вы получаете вспышку текста элемента TabBar, прежде чем он будет заменен фактическим значком.

Есть ли другое место, где я должен перехватывать поведение ToolBar?

[assembly: ExportRenderer(typeof(TabbedPage), typeof(TabRenderer))]
namespace Cellar.iOS.Renders
{
    public class TabRenderer : TabbedRenderer
    {
        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);

            var list = new List<UIBarButtonItem>();

            foreach (var item in NavigationController.TopViewController.NavigationItem.RightBarButtonItems)
            {
                if (string.IsNullOrEmpty(item.Title))
                {
                    continue;
                }

                if (item.Title.ToLower() == "add")
                {
                    var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Add)
                    {
                        Action = item.Action,
                        Target = item.Target
                    };

                    list.Add(newItem);
                }

                if (list.Count > 0)
                    NavigationController.TopViewController.NavigationItem.RightBarButtonItems = list.ToArray();
            }
        }
    }
}

Ответ 1

переопределить метод OnElementChanged:

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if(e.NewElement!= null)
        {
            var list = new List<UIBarButtonItem>();

            // Your code goes here
        }
    }

Ответ 2

Да, вы должны переопределить PushViewController и наследовать от метода NavigationRenderer. Вот что я использую в своем приложении:

public class CustomToolbarRenderer :  NavigationRenderer
{
    public override void PushViewController(UIViewController viewController, bool animated)
    {
        base.PushViewController(viewController, animated);

        List<UIBarButtonItem> newItems = new List<UIBarButtonItem>();

        foreach (UIBarButtonItem i in TopViewController.NavigationItem.RightBarButtonItems)
        {
            if (i.Title != null)
            {
                if (i.Title.Equals(Constants.Toolbar.Add))
                {
                    var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Add);
                    newItem.Action = i.Action;
                    newItem.Target = i.Target;

                    newItems.Add(newItem);
                }
                else if (i.Title.Equals(Constants.Toolbar.Camera))
                {
                    var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Camera);
                    newItem.Action = i.Action;
                    newItem.Target = i.Target;

                    newItems.Add(newItem);
                }
                else if (i.Title.Equals(Constants.Toolbar.Delete))
                {
                    var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Trash);
                    newItem.Action = i.Action;
                    newItem.Target = i.Target;

                    newItems.Add(newItem);
                }
                else
                    newItems.Add(i);
            }
            else
                newItems.Add(i);
        }

        TopViewController.NavigationItem.RightBarButtonItems = newItems.ToArray();
    }
}

Ответ 3

Попробуйте приведенный ниже код в конце или после выполнения требуемого блока кода...

return base.ViewWillAppear(animated);