无法更新 UILabel!在 ViewController 中具有字符串值

Cannot update UILabel! in ViewController with string value

好的,所以这个应用程序应该做的就是在屏幕上显示一个时钟,该时钟每秒通过计时器更新一次。我正在使用 Xcode 8/Swift 3.

下面是来自viewcontroller的代码:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

            let clock = clockClass()
            clock.startTimer()
            //currentTime.text = "It Works Here!"
    }

    func updateClockView(updatedTime : String) {

        print("new time is: \(updatedTime)")
        //currentTime.text = updatedTime
    }

/*

ACTIONS AND LABELS BELOW HERE PLEASE

*/

@IBOutlet weak var currentTime: UILabel!

}

如果我重新运行ge 代码以便所有代码都在 viewcontroller 文件中,那么它可以完美运行。在尝试维护像 appea运行ce 这样的 MVC 时,我将计时器代码移到了另一个 class,然后将更新的时间传回给 viewcontroller。

下面是来自另一个 class 的代码,称为 clockClass。

import Foundation

class clockClass{

let view = ViewController()

public func startTimer(){
    var timer = Timer()
    timer = Timer.scheduledTimer(timeInterval: 1,
                                 target:self,
                                 selector: #selector(clockClass.updateClock),
                                 userInfo: nil,
                                 repeats: true)

    timer.fire()

}

/*
 updateClock CONSTRUCTS THE CURRENT TIME BY EXTRACTING THE HOURS, MINUTES AND SECONDS COMPONENTS FROM THE CALENDAR OBJECT AND THEN FORMATTING THAT DATE INTO STRING FORMAT. THE CLOCK ON THE SCREEN IS THEN UPDATED IN REAL TIME.

 */
@objc func updateClock(){
    let dateObject = NSDate()
    let calendar = NSCalendar.current
    let components = calendar.dateComponents([.hour, .minute,.second], from: dateObject as Date )

    let formatter = DateFormatter()
    formatter.timeStyle = .medium

    let theDateIWant = calendar.date(from: components)!
    let timeString = formatter.string(from: theDateIWant)



    view.updateClockView(updatedTime: timeString)
}
}

我可以通过调试器看到一切正常,直到将 "updatedTime" 分配给 UILabel!在 viewcontroller 中的 updateClockView() 中。它在 "fatal error: unexpectedly found nil while unwrapping an Optional value" 的赋值点崩溃。变量 "updatedTime",经检查,returns 为普通字符串,而不是可选字符串。奇怪的是,我可以更新 UILabel!通过 "currentTime.text = stringVariable/textString" 如果我从 viewDidLoad() 中这样做。然而,这并不是每秒更新一次。

如果,当 运行 程序正常运行时,我打印到控制台而不是更新 UILabel!,新时间每秒都会打印出来。

我已经尝试过以各种方式后置运行修改代码以及使用 dispatchQueue.main.async() 更新主线程(我假设我在程序 运行 没有编译或运行时错误,但时钟没有显示,没关系更新自己)。

其他谷歌搜索仅导致对旧版本 swift 的引用,其中包含已弃用的功能或 posts/articles 这似乎超出了我的理解范围。

任何人都可以发现我遗漏的阻止此程序正常运行的错误吗?我已经在这里工作了 10 多个小时,没有多少头发可以留了....

非常感谢!

编辑:在此处查看屏幕截图:[1]:http://i.stack.imgur.com/rgQgd.png

查看您的代码,您似乎缺少委托的基本概念。

这整个事情可以通过 delegation 模式来完成,或者这可以通过添加两行代码来完成。只需在 clockClass class

中创建一个 属性 of ViewController

您需要在 clockClass

中进行更改

let view = ViewController()var view: ViewController

替换 ViewController

中的这些行
let clock = clockClass()
clock.startTimer()

这些行

let clock = clockClass()
clock.view = self
clock.startTimer()