我遇到的问题导致我的应用程序崩溃,试图更新Viewcontroller上标签的内容。以下是我的代码。
if numberOfLoops < numberOfLoopsReq {
// delay before and play
counter?.increment()
//getCounterValue()
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue),0)) {
ViewController().self.numberOfLoopsExecuted.text = self.counter?.count.description
dispatch_async(dispatch_get_main_queue()) {
//do nothing here
}
}
let delayMp3 = (GlobalVariables.DelayBeforeSong + GlobalVariables.DelayAfterSong) * Double(NSEC_PER_SEC)// nanoseconds per second
let delayTimePlayer = dispatch_time(DISPATCH_TIME_NOW, Int64(delayMp3))
dispatch_after(delayTimePlayer, dispatch_get_main_queue(),{
self.player!.play()
})
numberOfLoops = GlobalVariables.NumberOfLoops
}
导致崩溃的调用是调用:
ViewController().self.numberOfLoopsExecuted.text = self.counter?.count.description
答案 0 :(得分:2)
首先,ViewController().self.numberOfLoopsExecuted.text
没有任何意义 - self
引用“此对象”,因此提供实例然后访问其self
是多余的。
更基本的ViewController()
创建了一个ViewContoller类的新实例。由于您不是从NIB或故事板场景创建此实例,因此不会对其IBOutlet进行初始化,并且会在意外发现nil 时发生崩溃。此外,由于您没有以任何方式呈现,因此这个新实例将不可见。
您没有指出您所显示的代码所在的类,但假设它位于您的ViewController
中,那么您只需要
self.numberOfLoopsExecuted.text=self.counter?.count.description
如果此类不是您的ViewController,那么您将需要以某种方式提供对当前屏幕上视图控制器实例的引用。
您不应该使用description
函数将int转换为字符串;这只是用于调试。您应该使用字符串插值或字符串格式进行格式化。
此外,将counter
声明为var counter=0
而不是var counter?
可能更有意义 - 这样可以避免不断展开它。