从导航控制器设置 rightBarButtonItem

Posted

技术标签:

【中文标题】从导航控制器设置 rightBarButtonItem【英文标题】:Setting rightBarButtonItem from Navigation Controller 【发布时间】:2014-06-11 14:34:57 【问题描述】:

如何从导航控制器而不是视图控制器设置右栏按钮?

我一直在阅读有关编写 SOLID 视图控制器的文章,该控制器仅作为控制器工作,而不是向其中添加所有内容。

帖子建议将导航逻辑移到视图控制器之外(我同意)。此外,视图控制器真的不应该设置它嵌入的导航控制器,所以我试图将设置导航栏的代码移动到我的自定义 UINavigationController 类。

我部分成功了,我设法更新了颜色,但无法设置rightBarButtonItem

将这些行添加到视图控制器将起作用,但我想从 UINavigationController 子类中完成。

let settingsImage = UIImage(named: "settingsButton")
self.rightBarButton = UIBarButtonItem(image: settingsImage, style: UIBarButtonItemStyle.Plain, target: self, action: "showSettings")
self.navigationItem.rightBarButtonItem = self.rightBarButton;

我查看了“默认导航按钮”问题,该问题建议创建父视图控制器并从中继承所有视图控制器,但我真的不喜欢视图控制器正在设置导航控制器的事实。应该是相反的。

编辑:我到了self.navigationBar.items。如果我将其设置为 nil,则不会显示任何内容。所以我可能需要改变它。尚不确定如何。

【问题讨论】:

您为此创建了一个 UINavigationController 子类?左右 BarButtons 是控制器 navigationItem 的属性,而不是 navigationController。 viewControllers 堆栈中的每个 viewController 都有自己的 navigationItem。我不确定你想做什么是可能的,但我会调查一下。 @pedros 看看我的编辑。 您为什么要这样做?很奇怪的问题。 我把它写成对 Fogmeister 回答的评论。 【参考方案1】:

导航控制器不拥有显示的导航栏,因此不拥有它们上的按钮。

导航控制器将视图控制器推送到屏幕上并为它们提供导航栏。然后由视图控制器配置导航栏(标题、栏按钮等)。除了返回按钮,它默认配置了前一个控制器的标题。

所以无论如何,这不是“设置导航控制器”而是配置属于视图控制器的导航栏。

最好的地方是视图控制器本身。

如果您想在整个应用程序中使用默认按钮,那么您可以为所有视图控制器创建一个“父子类”。 (但您受限于可以使用的控制器类型)。

或者我过去曾使用这样的方法在UIBarButtonItem 上创建一个类别...

+ (UIBarButtonItem *)myDefaultButtonWithTarget:(id)target action:(selector)action

这意味着你必须在你想要的每个视图控制器中调用它......

self.navigationItem.rightBarButtonItem = [UIBarButtonItem myDefaultButtonWithTarget:self action:@selector(doSomething)];

但这意味着您只需要一行代码就可以完成,而不必每次都进行配置。此外,您可以通过更改类别在任何地方更改按钮。

文档: https://developer.apple.com/reference/uikit/uinavigationbar

【讨论】:

我喜欢第一类,因为这样做会集中所有内容。虽然我觉得导航项归视图控制器所有有点奇怪。好吧我想,每个视图控制器都实现了自己的导航按钮,但是现在所有导航项相关的代码都分散了。

以上是关于从导航控制器设置 rightBarButtonItem的主要内容,如果未能解决你的问题,请参考以下文章

从导航栏视图控制器导航到标签栏视图控制器

展开多个导航控制器

展开多个导航控制器

如何在更多视图控制器的导航栏中设置图像并将更多标签的颜色从白色更改为绿色..?

从推送视图访问第一个导航控制器中的方法和变量

有人知道如何从导航栏中删除不需要的动画吗?截图