Xamarin Forms iOS渲染器 - 工具栏标准图标

11
我可以创建一个简单的选项卡渲染器,它可以更新我的表单工具栏项目以使用内置的iOS图标,如下所示。
在ViewWillAppear中才有非NULL的NavigationController。如果我在ViewDidLoad中尝试,则为NULL。
问题在于在实际图标替换之前会先显示选项卡条目文本。
是否有其他地方应该拦截工具栏行为?
[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();
            }
        }
    }
}

尝试将 base.ViewWillAppear(animated); 移动到末尾。 - Gerald Versluis
这个不起作用,谢谢。 - aherrick
你在模拟器上还是真实设备上看到这个闪烁? - Rohit Vipin Mathews
真实设备。这是因为在ViewDidLoad中已经标记了“添加”文本,然后用iOS +替换。 - aherrick
@valdetero的答案似乎在这里是最正确的。为出现在UINavigationBar中的项目定制TabbedRenderer似乎很奇怪。相反,您应该自定义NavigationRenderer,并将其用于包装内容页的NavigationPage。 - therealjohn
3个回答

1

是的,你应该重写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();
    }
}

谢谢,但这对于选项卡切换不起作用。请参见我上面的示例应用程序。 - aherrick

1

重写OnElementChanged方法:

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

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

            // Your code goes here
        }
    }

这个不起作用。此时 NavigationController 为空。 - aherrick

1
在所需代码块的末尾或执行后,请尝试以下代码...
return base.ViewWillAppear(animated);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接