设置 UINavigationController 的工具栏项

Posted

技术标签:

【中文标题】设置 UINavigationController 的工具栏项【英文标题】:Setting Toolbar Items of UINavigationController 【发布时间】:2009-08-22 09:16:15 【问题描述】:

在 iPhone OS 3.0 中,您可以使用 setToolbarItems:animated: 方法。但是,这需要您传入一组 UIToolbarItems。虽然我可以通过编程方式创建这些工具栏项,但如果可能的话,我宁愿在 Interface Builder 中创建它们。

考虑到这一点,我在“MyGreatViewController.xib”中创建了一个 UIToolbar,并在其中填充了所需的工具栏项。然后,在“MyGreatViewController.m”中,我从工具栏中获取项目并将它们传递给setToolbarItems:animated:

- (void)viewDidLoad 
    [super viewDidLoad];
    [self setToolbarItems: [toolbar items]];

...其中toolbar 是一个引用 UIToolbar 的 IBOutlet。

这是一个好方法吗?有没有更好的方法来实现这一点?我应该只以编程方式创建项目吗?

【问题讨论】:

我有什么不明白的地方:你说“我从工具栏获取项目”,然后你把它们还给工具栏?不是已经显示了吗? 【参考方案1】:

我不知道这是否记录在任何地方,但我发现在 Interface Builder 中,如果启用导航控制器的工具栏,则可以将栏项目拖动到视图控制器,它们会自动显示在导航控制器的工具栏。

例如,我们可以这样做(在 Snow Leopard 上使用 Xcode 3.2):

    File->New Project....选择Navigation-based Application并创建项目。 在 Interface Builder 中打开 MainWindow.xib。 选择导航控制器,然后在属性检查器中,选中“显示工具栏”框。这将导致工具栏对象出现。 将条形按钮项从库中拖到工具栏上。它将出现在工具栏中。如果您检查 NIB 中的层次结构,您会发现这个新项目是 RootViewController 的子项。

似乎任何添加为导航项子项的条形按钮项都将显示在导航栏中,并且任何添加为视图控制器子项的条形按钮项都将显示在工具栏中。

(我偶然发现了这一点。如果有人能找到有关此行为的文档或任何其他信息,我很想听听。)

【讨论】:

我相信这就是它应该的方式。有点像 UIViewController 神奇地加载它的 xib,如果它有一个匹配的文件名。 有效!我认为这绝对是在导航视图中设置工具栏的最佳方式。 在我的应用程序中,我有一个选项卡栏控制器,其中一个选项卡是一个导航控制器——非常标准的配置。但是,如果我按照 Kristopher 的建议进行操作,则在第 3 步之后,工具栏会出现在 IB 的选项卡栏后面!当我尝试第 4 步(我尝试添加段控件/按钮)时,它只是不允许我将它放在工具栏上。我在这里错过了什么吗? 我知道这已经很老了,但是您知道如何为 RootViewController 的子视图执行此操作吗?换句话说,如果在 RootViewController 的代码中我创建了一个位于它自己的 nib 中的 FooController 并推送它,那么如何在 Interface Builder 中设置 FooController 的工具栏按钮? @iand675 同意,我也想知道 IB 是否有解决方案【参考方案2】:

这是一种完全可以接受的方式,但请记住,在 iPhone 上加载 xib 文件非常昂贵,并且在 viewDidLoad 方法中以编程方式创建工具栏项可能会更快。

【讨论】:

太棒了。由于在视图控制器类初始化时已经加载了 XIB(我在创建视图控制器文件时检查了“使用 XIB 作为用户界面”),这种方法不应该比以编程方式创建工具栏项更昂贵。 啊,如果您已经在加载 XIB,那么您不会增加太多额外的时间。从 XIB 中取消归档对象比在代码中创建它们更昂贵,但除非您的视图需要很长时间才能加载,否则我不会担心。

以上是关于设置 UINavigationController 的工具栏项的主要内容,如果未能解决你的问题,请参考以下文章

设置所有 uinavigationcontroller 的高度

UINavigationController如何设置标题

设置 UINavigationController 框架不会改变外观

无法在 UINavigationController 上设置后退按钮

使用 UINavigationController 时 UIStackView 无法设置底部约束

UINavigationController 如何在子视图中设置标题等