2017-06-12 48 views
1

誰能告訴我爲什麼這段代碼給出錯誤消息「#selector'的參數不是指'@objc'方法,屬性或初始值設定項「?'#selector'的參數沒有引用'@objc'方法,屬性或初始值設定項

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

這裏的功能:

func updateTimer(until endTime: Int) { 
    counter -= 1 
    timeLabel.text = String(counter) 
    if counter == endTime { 
     step += 1 
    } 
} 

我曾嘗試:
1.添加@objc在函數的前面。

回答

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

對於定時器參數是必需的。 *選擇器應該有以下簽名:timerFireMethod :(包括一個冒號來表示該方法需要一個參數)*附註 - 另外,在Swift 4中,類可能需要'@ objc'或'@ obcMembers' 。 – Sulthan

+1

@Sulthan事實並非如此。不帶參數的'updateTimer()'也可以。 *應該*不是*必須有* ;-) – vadian

相關問題