我有一个带有4个视图控制器的标签栏控制器,并且在导航控制器中有这个标签栏控制器。
我想为标签栏控制器的一个特定视图控制器显示一个UIBarButtonItem。
我尝试使用以下
if (tabBarController.selectedViewController == customTourViewController)
{
[tabBarController.navigationItem setRightBarButtonItem:done];
}
但按钮没有出现。
如果我将每个视图控制器放在导航控制器中,那么该按钮仅显示该视图,但最终我有2个导航栏。
有什么办法可以实现第一个解决方案吗? 感谢。
答案 0 :(得分:24)
在各个选项卡的各个视图控制器中,我需要按钮的那个:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
style:UIBarButtonSystemItemDone target:nil action:nil];
self.tabBarController.navigationItem.rightBarButtonItem = rightButton;
}
在不需要按钮的视图控制器中,我有:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.tabBarController.navigationItem.rightBarButtonItem = nil;
}
所以,如果它不适合你,我不确定它是否是tabBarController
没有self
指定的引用(如果我省略self
我得到编译器错误)。这段代码在哪里,因为如果它在你的tabBarController子类中,那么你想要self.navigationItem.rightBarButtonItem
,对吧?您是否为该变量名定义了自己的ivar?或者您确定done
已正确定义(即不是nil
)?或者您确定正在调用此代码(可能设置断点或插入NSLog
并确保到达此代码)?
答案 1 :(得分:4)
或者,您可以在需要按钮的同一视图中实现viewWillDisappear。
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
self.tabBarController.navigationItem.rightBarButtonItem = nil;
}
答案 2 :(得分:0)
上面接受的答案正是我所需要的,只是想将来将其转换为Swift。
我已将以下代码添加到需要bar按钮的视图控制器中(此示例中,我创建了一个add按钮):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.tabBarController?.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil)
}
在不需要此按钮的视图控制器中,只需在下面添加代码
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.tabBarController?.navigationItem.rightBarButtonItem = nil
}
您使用viewWillAppear
副viewDidAppear
是因为您希望每次用户转到指定的视图控制器时都显示条形按钮。
简单地说,viewDidAppear
在运行时被调用一次,viewWillAppear
将在每次访问视图控制器时被调用。