2014-06-11 21 views
1

如何从导航控制器而不是视图控制器设置正确的bar按钮?从导航控制器设置rightBarButtonItem

我一直在阅读有关编写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。如果我将其设置为零,则不会显示任何内容。所以我可能需要改变它。还不确定如何。

+1

您创建一个UINavigationController子类,这样做?左右BarButton是控制器navigationItem的属性,而不是navigationController。viewControllers堆栈中的每个viewController都有自己的navigationItem。我不确定你想要做什么是可能的,但我会研究它。 – pedros

+0

@pedros看看我的编辑。 –

+0

你为什么要这样做?非常奇怪的问题。 – Fogmeister

回答

2

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

导航控制器将视图控制器推到屏幕并给他们一个导航栏。然后由视图控制器配置导航栏(标题,栏按钮等)。除了后退按钮,该按钮被赋予前一个控制器的标题的默认配置。

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

这是视图控制器本身的最佳位置。

如果您希望在整个应用程序中使用默认按钮,那么您可以为所有视图控制器创建“父级子类”。 (但是那时你只能使用你可以使用的控制器类型)。

或者我在过去用这样的方法创建上UIBarButtonItem类别做到了这一点......

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

这意味着你必须调用它希望每个视图控制器...

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

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

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

+0

我喜欢第一类,因为这样做一切都会集中在一起。虽然我觉得导航条目属于视图控制器有点奇怪。那么我想,每个视图控制器都实现了自己的导航按钮,但现在所有与导航项目相关的代码都是分散的。 –

相关问题