Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin表单:如何访问“;tabBarController:shouldSelectViewController:";_C#_Ios_Xamarin_Xamarin.forms_Custom Renderer - Fatal编程技术网

C# Xamarin表单:如何访问“;tabBarController:shouldSelectViewController:";

C# Xamarin表单:如何访问“;tabBarController:shouldSelectViewController:";,c#,ios,xamarin,xamarin.forms,custom-renderer,C#,Ios,Xamarin,Xamarin.forms,Custom Renderer,我需要控制这个方法,以便我可以在我的应用程序中进行更改。但我无法实现这个功能,有人能帮我吗 以下是我的选项卡页面的自定义呈现程序: public class MainTabbedPageRenderer : TabbedRenderer, IUITabBarControllerDelegate { [Export("tabBarController:shouldSelectViewController:")] public bool ShouldSelectViewContr

我需要控制这个方法,以便我可以在我的应用程序中进行更改。但我无法实现这个功能,有人能帮我吗

以下是我的选项卡页面的自定义呈现程序:

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)
{
}

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

这就是说,Xamarin.iOS实际上为
ShouldSelectViewController
协议方法定义了一个名为
uitabarselection
tabbedderenderer
上有一个名为
ShouldSelectViewController
的属性,允许您设置此委托方法,因此您应该能够执行以下操作:

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

ShouldSelectViewController是一种方法,为什么不能在回答时输入一个值,可能实现了错误,可以用更多的代码补充回答吗?
选项卡Renderer
类型上有一个属性称为
ShouldSelectViewController
,类型是
uitabarselection
,它是一个C#委托。因此,您可以将一个签名与C#委托相同的方法分配给该属性。我测试了上面的内容,效果如预期。请输入您的答案。我的答案是完整的,并按书面形式工作。也许您对Obj-C委托和C#委托感到困惑。在Obj-C中,委托通常是一个协议(类似于C#接口),是一个用于处理来自使用该协议的对象(Obj-C委托)的事件的对象,而C#委托只是一个方法签名的定义,可以用作C#属性的类型,以便可以将方法分配给属性,如上所述。如果您需要更多信息,请阅读C#代表。哦,我明白了:。ColeX也是一样,只是使用lambda而不是命名方法。但最终的结果是完全一样的。