UIButton 文本未更新

UIButton text not updating

我在我的 iOS Swift 应用程序中使用的一个 "tried and true" 模式是我有几个带有 UIButton 的区域。按下按钮时,它会触发一些连接到我的 API 的网络代码。发生这种情况时,我让按钮文本显示 "please wait, loading" 并且我禁用了该按钮。当排队的操作在我的回调中完成时,我启用按钮文本并更改回原始状态。效果很好。

我最近添加了一些不使用 NSURL/NSDATA 的东西(它只是一个文件编写器)。我复制了所有相同的 GCD 队列代码,奇怪的是它没有更新按钮文本。

这是我的代码。当您点击按钮时,文本会变得不可见,直到回调完成,然后它才恢复原状。奇怪的是,如果我将模拟器更改为 iPad Pro,它实际上可以工作 (??) 并显示 "please wait, downloading"。如果我切换到 iPhone 6s 它不起作用。

@IBAction func btnGenerateCSV(sender: UIButton) {

        //Grab the original text of the button to restore later after done
        let originalButtonText = sender.titleForState(UIControlState.Normal)

        //Localized is an extension function I wrote.
        //As you can see I got crazy here adding all the UI States as a last ditch attempt to see if that was the reason.
        sender.setTitle(Localized("Downloading"), forState: UIControlState.Normal)
        sender.setTitle(Localized("Downloading"), forState: UIControlState.Disabled)
        sender.setTitle(Localized("Downloading"), forState: UIControlState.Highlighted)
         //I've tried moving this before the setTitle. No avail.
            sender.enabled = false
//I've tried the other queues as well, and even just tried dispatch_async(dispatch_get_main_queue()) but no luck

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { [unowned self] in

            CsvReportWriter.GenerateReport()
                {
                    r in
                    dispatch_async(dispatch_get_main_queue()) {
                        FileManager.WriteToFile(r, filename: self.filename)

                        if FileManager.FileExists(self.filename) {
                            self.docController = UIDocumentInteractionController(URL: FileManager.GetURLOfFile(self.filename))
                            self.docController.presentOptionsMenuFromRect(sender.frame, inView:self.view, animated:true)
                        }
                        //Restore button state and text b/c we're done
                        sender.enabled = true
                        sender.setTitle(originalButtonText, forState: UIControlState.Normal)
                    }

            }
        }  
    }

有什么想法吗?如果我将 CsvReportWriter.GenerateReport() 代码换成其他一些调用我的 API 的异步代码,它就可以工作。

非常感谢!

所以我想 post 一个我认为有趣的答案 - 我有一个不同的帐户登录到我的 iPad Pro 模拟器..并注意到标签正确显示。在 iPhone 6 中没有。我登录了另一个帐户。

那么有什么区别呢?在 iPad pro 中生成了大约 1,000,000 个测试行,在 iPhone 中生成了 3 个,所以一切都完成得如此之快,甚至没有 UI 需要更新。

我引入了一个延迟作为测试,并注意到它实际上有效/导出,所以它实际上就是这样。

原来事情 运行 太快了,甚至没有时间更新到 'please wait' 哈哈

很抱歉打扰任何人,但请随意使用上面的代码,因为它应该可以有效地满足您的需求:)