好的,所以所有这个应用程序应该做的就是在屏幕上显示一个时钟,每秒钟通过一个计时器更新。我正在使用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!
}
如果我重新排列代码以便所有代码都在viewcontroller文件中,那么它可以完美地工作。在尝试维护类似MVC的外观时,我将计时器代码移动到另一个类,然后将更新的时间传递回viewcontroller。
以下是其他类的代码,名为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()内。它在赋值点崩溃时出现“致命错误:在展开Optional值时意外发现nil”。检查时,变量“updatedTime”将返回普通字符串,而不是可选字符串。奇怪的是,我可以更新UILabel!如果我是从viewDidLoad()中执行此操作,请通过“currentTime.text = stringVariable / textString”。但是,这并不会每秒更新一次。
如果在正常运行程序时,我打印到控制台而不是更新UILabel !,新时间会很好地打印出来。
我已尝试以各种方式重新排列代码以及使用dispatchQueue.main.async()更新主线程(我假设我正在执行它,因为程序在没有编译或运行时错误的情况下运行但是时钟没有不显示,从不更新自己)。
其他的Google搜索仅导致对旧版本的swift的引用,其中包含已弃用的功能或帖子/文章,这些似乎超出了我的想法。
有人能发现我错过的错误,导致该程序无法正常工作吗?我已经在这里工作了10多个小时,并且没有多少头发可供使用....
非常感谢提前!
编辑:点击此处的截图:[1]:http://i.stack.imgur.com/rgQgd.png
答案 0 :(得分:2)
查看您的代码,您似乎缺少委派的基本概念。
这一切都可以通过delegation
模式完成,或者这可以通过添加两行代码来完成。只需在ViewController
类
clockClass
的属性即可
您需要在clockClass
let view = ViewController()
至var view: ViewController
替换ViewController
let clock = clockClass()
clock.startTimer()
使用这些行
let clock = clockClass()
clock.view = self
clock.startTimer()