启用 BarButtonItem 后仍然显示为非活动状态

After enable of BarButtonItem still appears inactive

这是我第一次 post 到 SO。我是一名上代码学校的程序员新手。

我的问题是我有一个用 Swift 编写的 iOS 应用程序。初始视图控制器是带有嵌入式 TableViewController 的 UINavigationController。它在右侧有一个名为 'New Game' 的 BarButtonItem。我在 ViewDidLoad 中将此按钮设置为禁用。

newGameButton.enabled = false

启动时,一些代码是 运行 从服务器检索一些 JSON 数据。当成功 returns 时,这非常快,我想启用 BarButton Item。我这样做:

newGameButton.enabled = true

BarButtonItem 确实有效,尽管它仍然是灰色的,因为我可以点击它,这会将我带到另一个 TableViewController。然后该按钮立即显示为活动状态。或者,如果我只是坐下来等待大约 15 秒,'New Game' 按钮最终将变为活动状态。但是,如果我立即旋转,无论是在 iOS 模拟器中还是在 运行 iPhone 上的应用程序时,它都会立即正确显示为处于活动状态。

我搜索了 SO 并尝试了以下建议但没有成功:

self.navigationItem.rightBarButtonItem?.enabled = true

我还尝试为导航栏和父视图启用用户交互,结果相同。

self.navigationController?.navigationBar.userInteractionEnabled = true
self.navigationController?.view.userInteractionEnabled = true

我试过寻找一些方法来 'force' 导航控制器进行更新,但空手而归。

我期待听到有关如何解决此问题的想法。

作为附加说明,我们获取 JSON 数据的请求使用的是 NSURLSession,我知道它是异步的,因此不会阻止 UI 更新。

您需要 self.navigationController.navigationBar.userInteractionEnabled = false

的条形按钮

条形按钮的前景色为灰色。为了获得禁用效果。

栏按钮没有响应 enabled 属性。

否则你可以使用带自定义视图的条形按钮

您是否在后台线程中设置启用 属性?为了 UI 更新正确发生,您需要在主线程上进行视觉更改。

dispatch_async(dispatch_get_main_queue(), {
    newGameButton.enabled = true
})