我有两个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的标签仍然保留。
答案 0 :(得分:0)
如果我理解你正在做什么,我首先要尝试的是在这一行之前检查两个视图控制器:
((UIButton *)[self.navigationController.view viewWithTag:LOGIN_BUTTON_TAG]).hidden = true;
放一个
NSLog("View is %@", self.navigationController.view);
检查是否将viewWithTag发送到正确的视图。 不确定这一点,但你是否试图通过UIViewcontroller访问视图,控制器,加载到UINavigationcontroller中? 在这种情况下,我会使用:
(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];
答案 1 :(得分:0)
最简单,最具扩展性的解决方案是避免像瘟疫那样使用viewWithTag:
。
将UIBarButtonItem
设为ivar,然后即可轻松访问它。
替换
[loginButton setTag:1111111];
与
self.loginButton = loginButton;
然后检索这个
self.loginButton;
而不是
(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];
我知道哪一个看起来更优雅,更健壮