我有两个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/

10-10 15:52