2016-09-19 42 views
0

好的,所以這個應用程序應該做的很遠就是在屏幕上顯示一個通過計時器每秒更新的時鐘。使用Xcode中8 /斯威夫特3.無法更新UILabel!在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! 

} 

如果我重新安排代碼,以便所有的它是視圖 - 控制文件中,然後將它完美的作品。在試圖保持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()內。它在賦值點崩潰,出現「致命錯誤:在解包可選值時意外發現零」。變量「updatedTime」在檢查時以普通字符串形式返回,而不是可選字符串。奇怪的是,我可以更新UILabel!通過「currentTime.text = stringVariable/textString」,如果我這樣做從viewDidLoad()。但是,這並不是每秒更新一次。

如果在正常運行程序時,我打印到控制檯而不是更新UILabel!,新的時間每秒打印一次。

我已經嘗試以各種方式重新排列代碼以及使用dispatchQueue.main.async()更新主線程(我假設我正在做的正確,因爲程序運行時沒有編譯或運行時錯誤,但時鐘沒有顯示,從未自我更新)。

其他Google搜索只會引用舊版本的swift,不推薦使用的函數或帖子/文章看起來超出我的頭。

任何人都可以發現我錯過的錯誤是阻止此程序正常工作嗎?我已經在這個超過10小時了,沒有太多的頭髮留下來......

非常感謝提前!

編輯:見截圖在這裏:[1]:http://i.stack.imgur.com/rgQgd.png

+0

檢查UILabel的參考。它在你分配價值的地方獲得零。放一個斷點,檢查標籤是否爲零。 –

+0

我認爲插座沒有連接或參考是星期不知何故。 –

+0

感謝您的回覆。我已經刪除並從標籤恢復出口到代碼無濟於事。我添加了截圖,希望能夠讓事情更清晰。 – Rossco

回答

2

看你的代碼,它似乎像你缺少代表團的基本概念。

這整個事情可以通過delegation模式完成,或者這可以通過添加兩行代碼來完成。只需在您的clockClass

變化創造ViewController一個屬性,你需要在clockClass

let view = ViewController()var view: ViewController

ViewController

let clock = clockClass() 
clock.startTimer() 

替換這些行通過這些線

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

嗨阿薩德。你上面提出的代碼不起作用 - 我得到錯誤,說需要類初始化程序。我查了一下使用代表的另一個建議,它完美地工作了!非常感謝您的幫助! – Rossco