我正在尝试创建一个非标准的顶部导航栏以在我的整个应用程序中使用。为了实现这一点,我一直在尝试子类化 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
类型的调用。
任何人都可以帮我解决我在这里缺少的东西吗?
编辑 最后我发现我错过了一个事实,即您可以在 Storyboard 中设置自定义 UINavigationBar。将其与 miguel 的回答结合起来,我最终上了课
partial class TopNavBar : UINavigationBar
{
public TopNavBar(IntPtr test) : base(test) {
}
[Export ("initWithCoder:")]
public TopNavBar (NSCoder coder) : base (coder) {
InitCustom ();
}
}
最佳答案
调用 IntPtr 构造函数以响应由 Objective-C 创建并呈现给 C# 的对象。这通常不是这些类的实例化方式。
您必须问自己的第一个问题是:谁在创建您的类的实例?
- 您从 C# 创建此类的实例:您使用适当的参数调用构造函数。
- 在反序列化期间创建(例如,从 Storyboard、XIB 或您自己的存档数据加载),那么您需要提供采用 NSCoder 参数的构造函数。
- 根据需要重新创建您的实例(可能表明存在问题,因为这意味着您的对象已被销毁,但 Objective-C 保留了对它的引用,现在它又重新浮出水面),IntPtr 构造函数。
在你上面的例子中,有一个错误:你正在覆盖 IntPtr 构造函数,它应该只调用基类 IntPtr 构造函数(因为它意味着“我有一个指向 objective-c 中的真实对象的指针,创建它的包装器”)。
我的猜测是您使用的是 C#,所以在这种情况下,您需要提供一个不带参数的新构造函数:
public ZooNavigationController () : base (typeof (YourNavigation), typeof(YourBar)) {
// Your own initialization goes here
}
关于c# - Xamarin 使用自定义 UINavigationBar 子类化 UINavigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33046653/