通过子类定义自定义UINavigationBar会删除导航项

时间:2011-09-12 18:21:53

标签: uinavigationcontroller xamarin.ios uinavigationbar

我正在尝试按照标准方法创建自定义UINavigationBar以更改其背景图像,但在子类化过程中发现了一个问题。如果我将UINavigationController子类化,旨在覆盖虚拟NavigationBar属性以提供我自己的实现,则所有导航项(任何左或右按钮和标题视图)都会消失。起初我认为这是由于背景在导航项的顶部呈现,但我可以用no-op子类重现问题。

使用以下代码可以重现:

[Register("NavigationBar")]
public class NavigationBar : UINavigationBar
{
    public NavigationBar () : base()
    {

    }

    public NavigationBar (NSCoder coder) : base(coder)
    {

    }

    public NavigationBar (IntPtr ptr) : base(ptr)
    {

    }

    public NavigationBar (NSObjectFlag t) : base(t)
    {

    }

    public NavigationBar (RectangleF frame) : base(frame)
    {

    }
}

[Register("NavigationController")]
public class NavigationController : UINavigationController 
{
    private UINavigationBar _navBar;

    public NavigationController () : base()
    {

    }

    public NavigationController (NSCoder coder) : base(coder)
    {

    }

    public NavigationController (IntPtr ptr) : base(ptr)
    {

    }

    public NavigationController (NSObjectFlag t) : base(t)
    {

    }

    public override UINavigationBar NavigationBar
    {
        get
        {
            if(_navBar == null) 
            {
                return base.NavigationBar;
            }

            return _navBar;
        }
    }

    public void SetNavigationBar(UINavigationBar navigationBar)
    {
        _navBar = (UINavigationBar)navigationBar;
    }
}

现在,丢失导航项所需要做的就是使用自定义类而不是默认类:

var navigationBar = new NavigationBar();
navigationBar.BarStyle = UIBarStyle.Black;
navigationBar.TintColor = HeaderColor;

var navigationController = new NavigationController();
navigationController.SetNavigationBar(navigationBar);

// ...

4 个答案:

答案 0 :(得分:1)

好吧,你的SetNavigationBar()方法没有将它传递给本机基类,并且由于你自己没有做任何显式绘图,如何为你的自定义NavigationBar类调用本机绘图代码?

在您的示例代码中,NavigationBar只是在空间中浮动,永远不会被告知绘制。

答案 1 :(得分:1)

为了子类化UINavigationBar,必须在派生类中定义IntPtr构造函数,并使用公共UINavigationController(Type navigationBarType,Type toolbarType)构造函数实例化UINavigationController。例如:

public class MyNavigationBar: UINavigationBar
{
    public MyNavigationBar(IntPtr h) : base(h)
    {
    }

    // Do something.
}

....

var navController = new UINavigationController(typeof(MyNavigationBar), typeof(UIToolbar));

我花了一些时间才弄明白。有关此页面的更多信息:http://developer.xamarin.com/guides/ios/platform_features/introduction_to_ios_6/在Subclassing UINavigationBar。

部分

答案 2 :(得分:0)

您是否可以创建一个示例项目,将NavigationItems直接添加到UINavigationController,然后使用子类UINavigationController / UINavigationBar使这些按钮消失?

谢谢,

ChrisNTR

答案 3 :(得分:0)

经过大量的研究和来回与Xamarin,这个问题的答案是你必须使用一个基本上没有操作的IB存根文件,但存在为您的导航元素穿梭所需的基本类型。我的OSS项目有一个工作示例:http://github.com/danielcrenna/artapp