Xamarin使用自定义UINavigationBar将UINavigationController子类化

时间:2015-10-09 20:30:56

标签: c# ios xamarin xamarin.ios

我正在尝试创建一个非标准的顶部导航栏,以便在整个应用程序中使用。为实现这一目标,我一直在尝试将UINavigationControllerUINavigationBar

作为子类

我有一个自定义NavigationController

partial class ZooNavigationController : UINavigationController
{
    public ZooNavigationController (IntPtr handle) : base (typeof(TopNavBar), null)
    {
        this.Handle = handle;
    }
}

指向基础构造函数

public UINavigationController (Type navigationBarType, Type toolbarType); 

我的自定义UINavigationBar课程TopNavBar,类似于......

public class TopNavBar : UINavigationBar
{
    public TopNavBar ()
    {
        InitCustom ();
    }

    public void InitCustom(){ 
        this.BackgroundColor = UIColor.Red; 
        // a bunch more custom stuff
    }
}

问题是,当我运行它时,从不调用TopNavBar。如果我尝试将构造函数调整为如下所示:

    public ZooNavigationController (IntPtr handle) : base (typeof(TopNavBar), null)
    {
        this.Handle = handle;
        TopNavBar test = (TopNavBar)this.NavigationBar;
    }

我得到一个运行时异常,它无法转换类型,因此它似乎忽略了我指定UINavigationBar类型的调用。

任何人都可以帮助我解决我在这里失踪的问题吗?

编辑最后我发现我错过了你可以在故事板中设置自定义UINavigationBar的事实。结合米格尔的回答,我最终得到了班级

partial class TopNavBar : UINavigationBar
{
    public TopNavBar(IntPtr test) : base(test) {
    }

    [Export ("initWithCoder:")]
    public TopNavBar (NSCoder coder) : base (coder)  {
        InitCustom ();
    }
}

1 个答案:

答案 0 :(得分:3)

调用IntPtr构造函数以响应Objective-C创建的对象并浮出水面到C#。这通常不是实例化这些类的方式。

您必须问自己的第一个问题是:谁在创建您班级的实例?

  • 您可以从C#创建此类的实例:您使用适当的参数调用构造函数。
  • 在反序列化期间创建(例如,从故事板,XIB或您自己的归档数据加载),然后您需要提供带有NSCoder参数的构造函数。
  • 根据需要重新创建实例(可能表示存在问题,因为这意味着您的对象已被销毁,但Objective-C保留了对它的引用,现在它又重新出现了),IntPtr构造函数。

在上面的例子中,有一个错误:你重写了IntPtr构造函数,它只应该调用基类IntPtr构造函数(因为它意味着“我有一个指向objective-c中真实对象的指针,创建它的包装“)。

我的猜测是你正在使用C#,所以在这种情况下,你想要的是提供一个不带参数的新构造函数:

public ZooNavigationController () : base (typeof (YourNavigation), typeof(YourBar)) {
   // Your own initialization goes here
}