1

我有两个 viewController,每个都需要导航栏右上角的登录按钮。

在 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,以及为什么 vc1 的标签仍然保留,即使我在不​​同的 viewController 中。

4

2 回答 2

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];
于 2012-04-12T15:57:19.290 回答
0

最简单最可扩展的解决方案是避免viewWithTag:像瘟疫一样使用。

制作UIBarButtonItem一个 ivar,然后您就可以立即访问它而没有任何歧义。

代替

[loginButton setTag:1111111];

self.loginButton = loginButton;

然后检索这样做

self.loginButton;

代替

(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];

我知道哪个对我来说看起来更优雅和健壮

于 2012-04-12T16:07:04.497 回答