首页 > 解决方案 > Xamarin 表单:如何访问“tabBarController:shouldSelectViewController:”

问题描述

我需要控制此方法,以便我可以在我的应用程序中进行更改。但是我无法使这个实现工作,有人可以帮忙吗?

这是我的 TabbedPage 的自定义渲染器:

public class MainTabbedPageRenderer : TabbedRenderer, IUITabBarControllerDelegate
{
     [Export("tabBarController:shouldSelectViewController:")]
     public bool ShouldSelectViewController(UITabBarController tabBarController, UIViewController viewController)
     {
          return false;
     }
}

断点根本不会停在那里。

我的印象是它不会在断点处停止,因为 TabBarController 始终为空,但屏幕加载并正常执行导航,我也无法填充此 TabBarController。

您可以使用此方法单击标签栏项目:

[Export("tabBar:didSelectItem:")]
public void ItemSelected(UITabBar tabbar, UITabBarItem item)
{
}

标签: c#iosxamarinxamarin.formscustom-renderer

解决方案


我没有看到你在哪里分配你的代表。这可能是它没有被命中的原因,您没有将委托分配给 UITabBarController(这是 TabbedRenderer 的基类)。此外,TabbedRenderer 已经分配了一个委托,因此您可能不想替换它。

也就是说,Xamarin.iOS 实际上为协议方法定义了一个名为的C# 委托。并且有一个调用属性允许您设置此委托方法,因此您应该能够这样做:UITabBarSelectionShouldSelectViewControllerTabbedRendererShouldSelectViewController

public class MainTabbedPageRenderer : TabbedRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
          this.ShouldSelectViewController = ShouldSelectViewControllerHandler;
    }

    bool ShouldSelectViewControllerHandler(UITabBarController tabBarController, UIViewController viewController)
    {
        return false;
    }
}

推荐阅读