我正在尝试创建一个非标准的顶部导航栏,以便在整个应用程序中使用。为实现这一目标,我一直在尝试将UINavigationController
和UINavigationBar
我有一个自定义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 ();
}
}
答案 0 :(得分:3)
调用IntPtr构造函数以响应Objective-C创建的对象并浮出水面到C#。这通常不是实例化这些类的方式。
您必须问自己的第一个问题是:谁在创建您班级的实例?
在上面的例子中,有一个错误:你重写了IntPtr构造函数,它只应该调用基类IntPtr构造函数(因为它意味着“我有一个指向objective-c中真实对象的指针,创建它的包装“)。
我的猜测是你正在使用C#,所以在这种情况下,你想要的是提供一个不带参数的新构造函数:
public ZooNavigationController () : base (typeof (YourNavigation), typeof(YourBar)) {
// Your own initialization goes here
}