如何从导航控制器而不是视图控制器设置右侧栏按钮?
我一直在阅读有关编写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,则不会显示任何内容。所以我可能需要改变它。还不确定如何。
答案 0 :(得分:3)
导航控制器不拥有显示的导航栏,因此不拥有它们上的按钮。
导航控制器将视图控制器推送到屏幕并为其提供导航栏。然后由视图控制器配置导航栏(标题,条形按钮等)。除了后退按钮,它给出了前一个控制器标题的默认配置。
所以无论如何,这不是“设置导航控制器”这是配置属于视图控制器的导航栏。
最佳位置是视图控制器本身。
如果您想在整个应用程序中使用默认按钮,那么您可以为所有视图控制器创建“父子类”。 (但是你只能使用你可以使用的控制器类型。)
或者我过去通过使用这样的方法在UIBarButtonItem
上创建类别来完成此操作...
+ (UIBarButtonItem *)myDefaultButtonWithTarget:(id)target action:(selector)action
这意味着你必须在你想要的每个视图控制器中调用它......
self.navigationItem.rightBarButtonItem = [UIBarButtonItem myDefaultButtonWithTarget:self action:@selector(doSomething)];
但这意味着您只需要一行代码就可以完成,而不必每次都配置它。此外,您可以通过更改类别在任何地方更改按钮。
文档: https://developer.apple.com/reference/uikit/uinavigationbar