无法获得自定义rightBarButtonItem

时间:2012-04-12 15:44:36

标签: iphone objective-c ios uinavigationcontroller rightbarbuttonitem

我有两个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的标签仍然保留。

2 个答案:

答案 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];

我知道哪一个看起来更优雅,更健壮