2017-06-12 4 views
1

は誰も私を伝えることができる「@objc」メソッド、プロパティまたは初期化子を指すものではありません。メソッド、プロパティまたは初期化子 "?引数は

私が試してみました何
func updateTimer(until endTime: Int) { 
    counter -= 1 
    timeLabel.text = String(counter) 
    if counter == endTime { 
     step += 1 
    } 
} 


1.機能の前で@objcを追加

timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:#selector(updateTimer(until: 3)), userInfo: nil, repeats: true) 

は、ここでの機能です。

答えて

1

ターゲット/アクションメソッドのセレクタは、パラメータを持たないか、または影響を受けるオブジェクトを1つのパラメータで渡す必要があります。

Timerの場合は、userInfoパラメータを使用してデータを渡します。

timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:#selector(updateTimer(_:)), userInfo: 3, repeats: true) 


func updateTimer(_ timer: Timer) { 
    let endTime = timer.userInfo as! Int 
    counter -= 1 
    timeLabel.text = String(counter) 
    if counter == endTime { 
     step += 1 
    } 
} 

囲むクラスは、フォームNSObjectを継承していない場合は、アクションメソッドに@objc属性を追加する必要があります。

+0

タイマーの場合、パラメーターは必須です。 (メソッドは、引数を取ることを示すためにコロンを含む)*サイドノート - また、スウィフト4にクラスの '@のobjc'または' obcMembers' @がおそらく必要です:timerFireMethod:*セレクタは、次のシグネチャを持つ必要があります。 。 – Sulthan

+1

@ Sulthanそれは本当ではない。 'updateTimer()'もパラメータなしで動作します。 * * * *持っている必要がありますではありません必要があります;-) – vadian