用于初始化UINavigationItem的习惯用法

时间:2011-03-13 03:45:37

标签: xcode interface-builder xib uinavigationitem

由于不推荐使用UIViewController navigationItem出口(是的,我有点落后),指定UINavigationItem的元素的正确用法是什么?

我已经看到了几种方法,但没有一种方法对我来说完全清楚:

  1. “在视图控制器的XIB中嵌入导航项”。

  2. 使用from-scratch值在代码中初始化导航项的属性。

  3. 在视图控制器中为导航控制器创建一个插座,在视图控制器的XIB中连接一个导航项,并使用其属性在代码中初始化(实际)导航项的属性。

    < / LI>

    It isn't clear告诉我如何“嵌入”导航项目(简单地将其添加为IB中视图控制器的子项无效);并且我不清楚哪种方法更好,或者就此而言,在哪里(以什么方法)做2或3。

2 个答案:

答案 0 :(得分:7)

1)如果控制器在XIB中创建,您可以在其上删除UINavigationItem并调整此项目 - 它将起作用。例如,当您在XIB中定义UINavigationControler时,您可以将一些控制器放在根视图控制器中。因此,您可以在XIB中为此控制器设置UINavigationItem

2)如果控制器从XIB加载它的视图(它由alloc创建,然后由initinitWithNibName:bundle:创建)它在XIB中仅显示为{ {1}}不支持File's Owner。在这种情况下,您应该在代码中配置导航项(我通常在UINavigationItem中执行)。没有必要创建它,它已经存在于控制器的viewDidLoad属性中

navigtionItem

也许可以为导航项目制作插座,但我不建议这样做。苹果公司宣称这样的出口已经过时了。我记得有一天我和同事一起讨论过这个问题,但我忘了它是什么(当时很明显)。

答案 1 :(得分:1)

在我们的项目中,我们要求尽可能使用户界面可以自定义UI。 因此,我将UINavigationItem添加到xib,配置它,将其作为插件链接到我的自定义UIViewController子类,然后在运行时使用添加到UIViewController的方法使用类别复制所有属性:

- (void)setNavigationItemPropertiesFromOtherItem:(UINavigationItem *)navItem 
{
    // WORKAROUND: we can't link UINavigationItem to UIViewController from IB, and navigationItem property in UIViewController is readonly
    self.navigationItem.title = navItem.title;
    self.navigationItem.prompt = navItem.prompt;
    self.navigationItem.hidesBackButton = navItem.hidesBackButton;
    if (navItem.backBarButtonItem != nil) 
    {
        self.navigationItem.backBarButtonItem = navItem.backBarButtonItem;
    }
    if (navItem.leftBarButtonItem != nil)
    {
        self.navigationItem.leftBarButtonItem = navItem.leftBarButtonItem;
    }
    if (navItem.rightBarButtonItem != nil)
    {
        self.navigationItem.rightBarButtonItem = navItem.rightBarButtonItem;
    }
    if (navItem.titleView != nil)
    {
        self.navigationItem.titleView = navItem.titleView;
    }
}

此解决方法还允许使用IB将条形按钮项链接到UINavigationItem。