【问题标题】:After enable of BarButtonItem still appears inactive启用 BarButtonItem 后仍然显示为非活动状态
【发布时间】:2016-09-14 07:40:54
【问题描述】:

这是我在 SO 上的第一篇文章。我是一名程序员新手,就读于代码学校。

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

newGameButton.enabled = false

在启动时,会运行一些代码以从服务器检索一些 JSON 数据。当它成功返回时,这非常快,我想启用 BarButton 项。我就是这样做的:

newGameButton.enabled = true

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

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

self.navigationItem.rightBarButtonItem?.enabled = true

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

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

我曾尝试寻找某种方法来“强制”导航控制器更新,但空手而归。

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

另外说明,我们获取 JSON 数据的请求使用的是 NSURLSession,据我所知是异步的,因此不会阻止 UI 更新。

【问题讨论】:

    标签: ios iphone uinavigationcontroller swift2 uibarbuttonitem


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢杰弗里!就是这样!
    • 那是 Jeffrey,如果你认识我,那是 Jeffro
    【解决方案2】:

    你需要的条形按钮self.navigationController.navigationBar.userInteractionEnabled = false

    并且 barbutton 的前景色为灰色。为了获得禁用效果。

    栏按钮没有响应enabled 属性。

    否则你可以使用带有自定义视图的 barbutton

    【讨论】:

    • 我最初的问题包含一个不准确的地方,我现在已经更正了。我可以很好地禁用按钮。我的代码也启用了它,但在我单击按钮、旋转模拟器/设备或等待大约 15 秒之前,该按钮仍保持“非活动”外观(灰色)。然后它正确显示为活动(蓝色文本而不是灰色)
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2011-02-18
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多