【问题标题】:Can't get to custom rightBarButtonItem无法自定义 rightBarButtonItem
【发布时间】:2012-04-12 15:44:36
【问题描述】:

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

【问题讨论】:

  • 我的第一个猜测是,在分配tag 和从tag 获得视图之间,您在tag 中添加了额外或更少的数字
  • 我的第二个猜测(严重的一个)是 222222 导致一些整数溢出并将其变成 -123648 或其他东西。尝试使用较小的标签,例如 2222
  • 我的标签实际上是 vc1 的 34590 和 vc2 的 234355。我只是用 1111111 和 222222 来明确这个问题,我在哪个 viewController 中。
  • 请注意,第二个 no 有 6 位数字。试试五位数的号码。我认为限制是 2^16 = 65,536。第一个不小于这个,第二个是更多。更好的是,尝试使用 65535。更好的是,NSLog它的值在比较之前 +1

标签: iphone objective-c ios uinavigationcontroller rightbarbuttonitem


【解决方案1】:

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

UIBarButtonItem 设为 ivar,然后您就可以立即访问它,而不会产生任何歧义。

替换

[loginButton setTag:1111111];

self.loginButton = loginButton;

然后检索这样做

self.loginButton;

而不是

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

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

【讨论】:

  • 您能否详细说明为什么viewWithTag: 如此糟糕?当您只需要“获取”这些元素时,我认为它是一种比为元素实例化 ivar 更优雅的解决方案。
  • 为什么要在整个视图层次结构中搜索并询问每个视图的标签,而您只有一个指向它的指针?您还依赖于一个很容易意外更改的变量。
【解决方案2】:

如果我正确理解你在做什么,我会尝试的第一件事是在这行之前检查两个视图控制器:

((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];

【讨论】:

  • 当我在 vc1 和 vc2 中记录 self.navigationController.view 时,我得到了完全相同的对象 (
  • 好吧,我就是这么说的 :-)(抱歉,我的英语不是很好)。从第二个视图控制器,您正在访问第一个视图控制器的视图,因此您只能看到带有标签 11111 的视图 :-)。尝试使用 (UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];
  • 显然您甚至可以使用 ivar,如 Paul.s 所写。在我的回答中,我试图关注代码中的错误,但还有其他方法:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多