c# - Xamarin 使用自定义 UINavigationBar 子类化 UINavigationController

标签 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); 

对于我的自定义 UINavigationBarTopNavBar 这类似于...

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/

相关文章:

c# - Xamarin.Forms 属性未保存在 Android 上的 Release 中

c# - MongoDB 计算某个项目在另一个表中被引用的次数

c# - 使用接口(interface)引用变量调用基类方法

ios - 如何在 Xcode 4 的 Zombies 工具中找出僵尸 CALayer 属于哪个 UIView?

android - 为什么当我的 Xamarin Android network_security_config.xml 文件的 debug-overrides 标记中包含有cleartextTrafficPermissed 标记时,未检测到标记?

c# - 等待 PushModalAsync 表单以 xamarin 表单关闭

c# - NUnit:无法加载文件或程序集 nunit.core

c# - 预置到 C# 数组

ios - UILocalNotification 随机字符串

ios - 自动布局阻止我更改 View 的中心