初始化 UINavigationItem 的成语
Posted
技术标签:
【中文标题】初始化 UINavigationItem 的成语【英文标题】:Idiom for Initializing UINavigationItem 【发布时间】:2011-03-13 03:45:37 【问题描述】:由于UIViewController
navigationItem 出口已被弃用(是的,我有点落后),指定UINavigationItem
的元素的正确成语是什么?
我看到了几种建议的方法,但没有一个对我来说是完全清楚的:
“在视图控制器中嵌入导航项”在视图控制器的 XIB 中。
在代码中使用从头开始的值初始化导航项的属性。
在视图控制器中为导航控制器创建一个出口,在视图控制器的 XIB 中连接一个导航项,并使用其属性在代码中初始化(实际)导航项的属性。
It isn't clear 告诉我如何“嵌入”导航项(只需将其添加为 IB 中视图控制器的子项无效);我不清楚这些方法中哪一种更好,或者,就此而言,在哪里(以什么方法)做 2 或 3。
【问题讨论】:
【参考方案1】:1) 如果控制器是在 XIB 中创建,您可以将 UINavigationItem
放在上面并调整此项目 - 它会起作用。例如,当您在 XIB 中定义 UINavigationControler
时,您可以将一些控制器作为根视图控制器放入其中。所以你可以在 XIB 中为这个控制器设置UINavigationItem
。
2) 如果控制器 从 XIB 加载它的视图(它由 alloc
创建,然后由 init
或 initWithNibName:bundle:
创建)它在 XIB 中仅显示为 File's Owner
支持UINavigationItem
。在这种情况下,您应该在代码中配置导航项(我通常在 viewDidLoad
中进行配置)。无需创建它,它已经存在于控制器的navigtionItem
属性中
self.navigationItem.title = @"Price List";
也许可以为导航项制作插座,但我不推荐这样做。苹果宣布这种插座已经过时是有原因的。我记得有一天和同事讨论过这个问题,但我忘记了它是什么(当时很明显)。
【讨论】:
所以,如果我理解正确 1:如果我想附加UINavigationItem
的控制器是 XIB 中另一个实体的子节点(例如 UINavigationController
),那么我可以“嵌入“UINavigationItem
小时候,它会起作用。 但是,如果控制器是 XIB 的所有者,则无法在 XIB 中附加UINavigationItem
。如果是这样,那很奇怪,因为这意味着虽然您可以使用 IB 为导航控制器中的初始视图指定 UINavigationItem
,但所有其余部分都必须在代码中指定。【参考方案2】:
在我们的项目中,我们要求用户界面尽可能地从 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。
【讨论】:
谢谢!我有同样的要求,我采用了你的方法。它有效。以上是关于初始化 UINavigationItem 的成语的主要内容,如果未能解决你的问题,请参考以下文章