UINavigationBar 直到表格视图更新后才更新栏按钮项

Posted

技术标签:

【中文标题】UINavigationBar 直到表格视图更新后才更新栏按钮项【英文标题】:UINavigationBar not updating bar button item until after table view update 【发布时间】:2014-07-30 17:55:51 【问题描述】:

我在导航控制器中嵌入了一个 UITableViewController。我的 rightBarButtonItem 是一个刷新按钮。按下时,该按钮会触发来自服务器的更新。更新是同步的(有时间我会改成异步请求)。我想做的事情在理论上听起来很简单。按下按钮后:

将栏按钮项更改为 UIActivityIndi​​catorView 刷新数据 重新加载tableView 将条形按钮项目改回刷新按钮。

然而,发生的事情是,我将 rightBarButton 设置为具有活动指示器视图的视图,但直到 表视图重新加载后它才会更新,这显然是没有意义的。我的服务器更新例程如下所示:

View Controller 调用单独的模型对象的“刷新”方法。 模型对象同步从服务器获取新数据 视图控制器调用 [self.tableView reloadData];

由于它是同步的,我认为它只会一步一步地前进,但这是行不通的。我怎样才能让activityIndi​​catorView在它应该的时候显示和消失?

【问题讨论】:

这是同步请求的预期结果,它会阻塞你的主线程。 这正是我感到困惑的原因。事情发生了混乱,但如果它是同步的,它们就不应该发生。 也许您的代码有问题。不用等待,当您修改导航栏时,会记录更新,但直到下一个屏幕重绘周期才会应用。但是你阻塞了主线程,而主线程是绘制 UI 的地方。因此,屏幕没有更新,导航栏也没有更新。 【参考方案1】:

当您修改导航栏时,这些修改实际上并不会立即应用于屏幕,而是在下一个屏幕更新周期、下一个屏幕刷新或下一次重绘期间应用。

在您的代码中,您似乎在设置导航栏后立即向服务器发送了一个同步请求。该请求现在阻塞了主线程,并且系统无法刷新屏幕,因为所有 UI 代码都在主线程上运行。

使用异步请求,或简单地在另一个线程上发送请求,或者您想尝试使用同步请求的其他巫术将帮助您解决问题。但这些解决方案的本质是主线程不会被任何同步方法阻塞。

【讨论】:

我将刷新更改为异步,效果更好。该按钮在刷新前变为活动指示器。但是,在异步刷新完成后调用的委托方法中,条形按钮项不会返回到刷新按钮。表格视图更新,我可以与 UI 交互,但按钮不会改变。有什么想法吗? @Halen 我建议你问一个新问题,因为这是一个不同的问题。

以上是关于UINavigationBar 直到表格视图更新后才更新栏按钮项的主要内容,如果未能解决你的问题,请参考以下文章

更新数据异步后重绘 UITableView

在 UINavigationBar 上呈现 UISearchController 时推送视图控制器

当用户在表格视图中向下滚动时,如何将 UINavigationBar 背景颜色从透明更改为红色

带有搜索图标的 UINavigationBar - 单击时推送模态搜索视图

如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?

iOS 右导航按钮不显示在 UINavigationBar