2016-09-19 2 views
0

OK、このアプリは遠く離れていなければならないので、毎秒タイマーで更新される時計が画面に表示されます。それがすべてのViewControllerファイル内にあること、それは完璧に動作しますので、私は、コードを再配置した場合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! 

} 

:Xcodeの8 /スウィフト3.

を使用してイムは、以下のViewControllerからのコードです。 MVCのような外観を維持しようとして、私は別のクラスにタイマコードを移動し、ちょうどviewcontrollerに更新された時間を渡した。

以下は、clockClassと呼ばれる他のクラスのコードです。私はすべてが右UILabelに「updatedTime」の割り当てまで正常に動作し、デバッガ経由で見ることができます

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) 
} 
} 

!ビューコントローラー内のupdateClockView()内で"致命的なエラー:予期せぬことに、オプション値をアンラッピングしている間にnilが見つかりません"という割り当ての時点でクラッシュします。変数 "updatedTime"は、チェック時に、オプションの文字列ではなく通常の文字列として返します。奇妙なことに、私はUILabelを更新することができます!経由で "currentTime.text = stringVariable/textString"経由で私はviewDidLoad()内から行う場合。しかし、これは毎秒更新されません。

通常のようにプログラムを実行しているときに、UILabelを更新する代わりにコンソールに印刷すると、新しい時間が毎秒素早く表示されます。

dispatchQueue.main.async()を使用してメインスレッドを更新するだけでなく、さまざまな方法でコードを並べ替えることを試みました(プログラムがコンパイルエラーまたはランタイムエラーで実行されたが、表示されませんでした、それ自体を更新することはありません)。

その他のグーグルグリーグは、廃止された機能を備えた古いバージョンのswiftや、私の頭の上にあるような投稿/記事を参照していました。

私はこのプログラムが正しく動作するのを妨げている行方不明のエラーを見つけ出すことができますか?私は今この10時間以上のために余裕が残っている多くの髪を持っていない....

事前に多くのおかげで!

編集:ここではスクリーンショットを参照してください:[1]:委任の基本的な概念が欠落しているようhttp://i.stack.imgur.com/rgQgd.png

+0

UILabelの参照を確認してください。あなたがそれに価値を与えているどこにもいなくなっています。ブレークポイントを入れて、ラベルがnilかどうかを確認してください。 –

+0

私はアウトレットが接続されていないか、または参照が何とか週であると思う。 –

+0

返事をありがとう。私は削除し、無駄にコードへのラベルからのアウトレットを復活させた。うまくいけばわかりやすくするためにスクリーンショットを追加しました。 – Rossco

答えて

2

はあなたのコードを見てみると、それはそうです。

このすべてのことはdelegationパターンで行うことができます。これは、2行のコードを追加するだけで実行できます。ただ、これらの行

ViewController

let clock = clockClass() 
clock.startTimer() 

にこれらの行を交換し、あなたのclockClassクラスであなたがvar view: ViewController

clockClass

let view = ViewController()に確認する必要があり

変更をViewControllerのプロパティを作成

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

こんにちは、Asad。上で提案したコードはうまくいきませんでした。クラスの初期化が必要であるというエラーが出ました。私は代理人を使ってあなたの他の提案を見て、それは完全に働いた!ご協力いただき誠にありがとうございます! – Rossco

関連する問題