如何在另一个类中更新swift中label.text的值

时间:2015-12-10 22:18:31

标签: ios swift uilabel

我遇到的问题导致我的应用程序崩溃,试图更新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 

1 个答案:

答案 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?可能更有意义 - 这样可以避免不断展开它。