4

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

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

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

  2. 使用从头开始的值在代码中初始化导航项的属性。

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

我不清楚如何“嵌入”导航项(只需将其添加为 IB 中视图控制器的子项无效);我不清楚这些方法中哪一种更好,或者,就此而言,在哪里(以什么方法)做 2 或 3。

4

2 回答 2

7

1) 如果控制器是在 XIB 中创建的,您可以将UINavigationItem其放在上面并调整此项目 - 它会起作用。例如,当您UINavigationControler在 XIB 中定义时,您可以将一些控制器作为根视图控制器放入其中。所以你可以UINavigationItem在XIB中拥有这个控制器。

2)如果控制器从XIB加载它的视图(它是由alloc然后init或创建的initWithNibName:bundle:)它只在XIB中显示为File's Owner它不支持UINavigationItem它。在这种情况下,您应该在代码中配置导航项(我viewDidLoad通常这样做)。无需创建它,它已经存在于navigtionItem您的控制器的属性中

self.navigationItem.title = @"Price List";

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

于 2011-03-13T10:01:54.943 回答
1

在我们的项目中,我们需要使 UI 尽可能地从 IB 定制。因此,我将 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。

于 2011-05-10T17:31:43.590 回答