无法更改 UIBarButtonItem
Posted
技术标签:
【中文标题】无法更改 UIBarButtonItem【英文标题】:Unable to change UIBarButtonItem 【发布时间】:2014-03-21 08:46:42 【问题描述】:**Background** 当我的应用加载时,UINavigationController
会以编程方式添加并给出 leftBarButtonItem
和 rightBarButtonItem
。在启动期间会检查是否需要新数据,如果需要,则运行一个方法从我们的 Web 服务器获取新数据。在此期间,rightBarButtonItem
更改为 UIActivityIndicatorView
,它将显示旋转活动指示器。数据下载完成后,rightBarButtonItem
返回到UIBarButtonItem
。这很好用。
在另一个UIViewController
上,我需要允许用户手动获取新数据并将他们的数据发送给我们。在此期间,我需要 rightBarButtonItem 像以前一样更改为UIActivityIndicatorView
。但是当我尝试这样做时,数据下载正常,但rightBarButtonItem
永远不会改变。
我认为我的问题可能与我无法引用 UINavigationController
及其导航项有关。
**代码** 我的第一个 UIViewController's
实现,其中更改了 rightBarButtonItem:
-(void)statusIsLoading
UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
uiLoading.hidesWhenStopped = YES;
NSLog(@"Start animating");
[uiLoading startAnimating];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:uiLoading];
-(void)statusFinishedLoading
UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
uiLoading.hidesWhenStopped = YES;
[uiLoading stopAnimating];
UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings:)];
self.navigationItem.rightBarButtonItem = showSettingsButton;
**我尝试过的** 我尝试在第二个 UIViewController
中设置 self.navigationItem.rightBarButtonItem
但这没有任何作用。我还尝试运行从实例化类中调用上述两种方法的方法:
InitViewController *ivcInstance = [[InitViewController alloc] init];
[ivcInstance performUpdate];
这可以很好地运行“performUpdate”代码,“performUpdate”方法称为“statusIsLoading”和“statusFinishedLoading”方法,但rightBarButtonItem
没有改变。
我认为这里缺少一些非常简单的东西。谢谢。
**Edit** 我刚刚尝试在第二个 UIViewController 的 pageLoad 上检查 rightBarButtonItem 的当前值,它似乎为零:
UIBarButtonItem *newItem = self.navigationItem.rightBarButtonItem;
这里 newItem = nil。我没有定位正确的导航项吗?它应该是“自我”以外的东西吗?
**编辑 2**
在第二个 UIViewController 中,我可以更改 navigationBar 的属性:
[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:0.6 green:0.01 blue:0.36 alpha:2.0f]];
但如果我尝试对 barButtonItem 进行相同操作,则没有任何反应,这是为什么呢?
[self.navigationController.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:uiLoading]];
与:
[self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:uiLoading]];
【问题讨论】:
【参考方案1】:在您的statusFinishedLoading
中有一些未使用的代码,如下所示
-(void)statusFinishedLoading
/*UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
uiLoading.hidesWhenStopped = YES;
[uiLoading stopAnimating];*/ //These are unused codes.
UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings:)];
self.navigationItem.rightBarButtonItem = showSettingsButton;
同样将NSLog
放入statusFinishedLoading
方法中,检查该方法是否被调用。
谢谢!
【讨论】:
嗨,实际上需要该代码来停止 UIActivityIndicatorView 的动画 - ([uiLoading stopAnimating];)。我可能会在这些方法之外声明指标。我已经逐步完成了代码,statusFinishedLoading 确实会触发,没有异常或错误。 你设置了self.navigationItem.rightBarButtonItem = nil;并检查旧的条形按钮是否被移除。 是的,我已经在第二个 UIViewController 中尝试过了,它没有删除 rightBarButtonItem。【参考方案2】:尝试在主线程块中设置 rightBarButtonItem。收到响应后,它不应阻塞 UI。
-(void)statusFinishedLoading
UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
uiLoading.hidesWhenStopped = YES;
[uiLoading stopAnimating];
UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings:)];
//Use a block to set the rightBarButton.
dispatch_async(dispatch_get_main_queue(), ^
self.navigationItem.rightBarButtonItem = showSettingsButton;
);
希望这能解决问题。
编辑:您需要在情节提要中创建一个 UINavgationitem,将 outlet 连接到 .h 文件并将其命名为 statusNavigationItem,然后引用此 navigationItem 对象来设置 rightBarButton。
【讨论】:
我刚刚尝试了您的想法(以及它的变体,例如将此调用放在有问题的 UIViewController 而不是这些方法所在的 UIVC 上。仍然没有乐趣。我只是注意到 self.navigationItem.rightBarButtonItem =当我在第二个 VC 中检查它时为零。 在这种情况下,在 viewController 上创建一个 UINavigationItem 对象并相应地连接出口。 这样说的有道理,不过我是一个 obj-c 菜鸟——我需要做什么? 我的 UINavigationController 在应用程序加载时以编程方式添加。在故事板中,我的 UIVC 都没有导航控制器,这有关系吗?在故事板中添加一个会影响已经存在的导航控制器吗? 尝试正确访问 navigationItem,因为以上是关于无法更改 UIBarButtonItem的主要内容,如果未能解决你的问题,请参考以下文章