Xcode 初始化UINavigationItem的习惯用法

Xcode 初始化UINavigationItem的习惯用法,xcode,interface-builder,xib,uinavigationitem,Xcode,Interface Builder,Xib,Uinavigationitem,既然UIViewControllernavigationItem outlets已被弃用(是的,我有点落后),那么指定UINavigationItem元素的正确习惯用法是什么 我已经看到了几种建议的方法,但没有一种对我来说是完全清楚的: 在视图控制器的XIB中“在视图控制器中嵌入导航项” 使用从头开始的值在代码中初始化导航项的属性 在视图控制器中为导航控制器创建出口,在视图控制器的XIB中连接导航项,并使用其属性在代码中初始化(实际)导航项的属性 对我来说,如何“嵌入”导航项(简单地将其作为视图

既然
UIViewController
navigationItem outlets已被弃用(是的,我有点落后),那么指定
UINavigationItem
元素的正确习惯用法是什么

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

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

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

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

  • 对我来说,如何“嵌入”导航项(简单地将其作为视图控制器的子项添加到IB中没有效果);我不清楚这些方法中哪一种更好,或者,就这一点而言,在哪里(用什么方法)做2或3。

    1)如果控制器是在XIB中创建的,您可以将
    UINavigationItem
    放在它上面并调整这个项目-它会工作的。例如,当您在XIB中定义
    uinavigationcontroller
    时,您可以将一些控制器作为根视图控制器放在其中。因此,您可以在XIB中为该控制器设置
    UINavigationItem

    2) 如果控制器从XIB加载它的视图(它是由
    alloc
    init
    initWithNibName:bundle:
    )创建的),它在XIB中仅显示为
    文件的所有者
    ,不支持
    UINavigationItem
    。在这种情况下,您应该在代码中配置导航项(我通常在
    viewDidLoad
    中进行配置)。不需要创建它,它已经存在于控制器的
    navigtionItem
    属性中

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

    也许这是可能的,使出口的导航项目,但我不推荐这个。苹果宣布这类产品过时是有原因的。我记得有一天和同事讨论过这个问题,但我忘了它是什么(当时很明显)。

    在我们的项目中,我们要求尽可能从IB定制UI。 因此,我将UINavigationItem添加到xib中,对其进行配置,将其作为出口链接到自定义UIViewController子类,然后在运行时使用category将方法复制所有属性添加到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。

    因此,如果我正确理解1:如果我要附加
    UINavigationItem
    的控制器是XIB中另一个实体的子实体(例如
    UINavigationController
    ),则我可以“嵌入”
    UINavigationItem
    作为子项,它将正常工作。但是,如果控制器是XIB的所有者,则无法在XIB中附加
    UINavigationItem
    。如果是这样,那就很奇怪了,因为这意味着虽然您可以使用IB为导航控制器中的初始视图指定一个
    UINavigationItem
    ,但其余的都必须在代码中指定。谢谢!我也有同样的要求,我采用了你的方法。它起作用了。