UIBarButtonItem 没有更新

Posted

技术标签:

【中文标题】UIBarButtonItem 没有更新【英文标题】:UIBarButtonItem not updating 【发布时间】:2014-07-31 17:08:43 【问题描述】:

我有一个从服务器获取数据的异步例程。当点击导航中的刷新按钮时,我将其替换为UIActivityIndicatorView,这部分工作正常。获取数据的对象有一个协议,当它完成检索数据时通知它的委托。当委托(UITableViewController 子类)接收到该方法时,我用新数据重新加载表视图,并为rightBarButtonItem 分配一个新的刷新按钮。但是,当我这样做时,UIBarButtonItem 不会改变。当我在分配之前调用 reloadData 方法时和之后调用它时都会发生这种情况。我不明白为什么根本没有发生这种变化。这是我正在使用的两个方法调用。

这行得通:

UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicatorView.color = [UIColor orangeColor];
[indicatorView startAnimating]; 
[self.navigationItem.rightBarButtonItem initWithCustomView:indicatorView];

这是行不通的:

self.navigationItem.rightBarButtonItem initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshOrderList:)];

我应该以不同的方式更改这些barButtonItems 吗?

【问题讨论】:

你确定你在主线程上吗? 网络对象在 [NSURLConnection sendAsynchronousRequest...] 的完成处理程序中调用委托方法。这不是在主线程上吗? 这不是这样做的方法。 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshOrderList:)]; 好了,我们开始吧。我在接受的答案中看到了我在这个网站上使用的方法。感谢您的澄清。 自定义视图初始化也是如此。 【参考方案1】:
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshOrderList:)];

你不能初始化一个已经初始化的对象并期望它正常工作。创建一个新的条形按钮项并将其设置为rightBarButtonItem

【讨论】:

【参考方案2】:

试试这个:

dispatch_async(dispatch_get_main_queue(), ^
    [self.navigationItem.rightBarButtonItem initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshOrderList:)];
);

【讨论】:

【参考方案3】:

如上所述,您无法更改栏按钮项中的值,尤其是当它是系统项时。如果您愿意,您可以创建这两个项目并在 ivars 中使用它们。不过,创建一个新的执行时间并不长,尤其是如果它可能永远不会被使用。

这被用于非 UITableViewController UIViewController 有一个到相关 UITableView 的出口的情况。

斯威夫特 5

@IBOutlet var table: UITableView!

@IBAction func toggleTableEdit(sender:UIBarButtonItem) 
    table.setEditing(!table.isEditing, animated: true)
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: (table.isEditing) ? .done : .edit, target: self, action: #selector(toggleTableEdit(sender:)))

【讨论】:

以上是关于UIBarButtonItem 没有更新的主要内容,如果未能解决你的问题,请参考以下文章

为 Bar 按钮项目和色调添加 Bg

在 UIBarButtonItem 的 customView 字段中更新 UIView

如何创建没有光泽效果的自定义 UIBarButtonItem

将 UiBarButtonItem 上的 UIImage 从标识符更新为图像

如何在IOS中重新加载UIBarButtonItem

UIBarButtonItem 在函数返回之前不会更新标题