我有两个viewControllers,每个viewControllers在导航栏的右上角都需要一个登录按钮。
在viewController1#viewDidLoad中,我像这样(缩写)设置了rightBarButtonItem
:
// set up the login button on the right
UIButton *loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *loginImage = [UIImage imageNamed:@"btn_login.png"];
[loginButton setBackgroundImage:loginImage forState:UIControlStateNormal];
[loginButton setFrame:CGRectMake(0, 0, loginImage.size.width, loginImage.size.height)];
[loginButton setTag:1111111];
UIBarButtonItem *loginItem = [[UIBarButtonItem alloc] initWithCustomView:loginButton];
self.navigationItem.rightBarButtonItem = loginItem;
[loginItem release];
我对其进行了标记,以便在
viewWillAppear
中,可以根据用户是否登录来使用viewWithTag:1111111
找出是需要隐藏还是可见。((UIButton *)[self.navigationController.view viewWithTag:LOGIN_BUTTON_TAG]).hidden = true;
当viewController2被推入堆栈时,我基本上运行相同的代码来设置我的
rightBarButtonItem
,但是我给它一个不同的标签(即222222)。在viewController2#viewWillAppear中,当我寻找
viewWithTag:222222
时,它返回为null,因此我无法隐藏/显示它。但是我注意到,如果使用与viewController1(1111111)中相同的标记,就可以实现。
为什么是这样?我的标签实际上是在文件顶部设置为常量的,因此将vc1中的随机数复制到vc2中似乎不明智,只是为了使它起作用。相反,我想了解为什么vc2的标签没有应用到
rightBarButtonItem
,以及为什么即使我在其他viewController中,vc1的标签也仍然保留。 最佳答案
最容易扩展的解决方案是避免像瘟疫一样使用viewWithTag:
。
将UIBarButtonItem
设置为一个ivar,然后就可以立即对其进行访问,而不会产生任何歧义。
更换
[loginButton setTag:1111111];
与
self.loginButton = loginButton;
然后进行检索
self.loginButton;
代替
(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];
我知道哪一个看起来对我来说更优雅,更强壮
关于iphone - 无法获取自定义的rightBarButtonItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10127086/