Xamarin 表单 - 导航后 CustomRenderer 不工作

Posted

技术标签:

【中文标题】Xamarin 表单 - 导航后 CustomRenderer 不工作【英文标题】:Xamarin Forms - CustomRenderer Not Working After Navigating Away 【发布时间】:2019-03-29 12:06:03 【问题描述】:

我的主页面的 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);


【问题讨论】:

当您说“自定义渲染器”时,这是视图的实际表单渲染器吗? IE。您正在显示视图控制器的 ViewWillAppear.... @SushiHangover 它是 PageRenderer 类的扩展。我已经编辑以包含完整的课程。 你能提供一个样品,以便我可以测试它吗? @LucasZhang-MSFT 我使用 Xamarin 模板创建了一个示例,该模板表现出相同的行为:icloud.com/iclouddrive/0DfTqRedqa_RytZ_VL-n5rFUQ#Example 好的,我会检查的 【参考方案1】:

检查这个代码sn-p

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为真,所以它跳出循环而不添加任何项目到list ,所以navigationItem.SetRightBarButtonItems 最后添加一个空数组。

解决方案

修改如下

if (RightNavItems.Title == null)

      rightNavList.Add(RightNavItems); //add this line.
      continue;

【讨论】:

以上是关于Xamarin 表单 - 导航后 CustomRenderer 不工作的主要内容,如果未能解决你的问题,请参考以下文章

在返回导航中跳过 xamarin 表单中的页面

Xamarin 表单反向 PushModalAsync

如何将 android 活动导航到 xamarin 表单

在 Xamarin 表单的导航页面中添加 SearchBar

混合 WebView 导航和导航事件在 Xamarin 表单中没有响应

Xamarin 表单导航和处理登录页面