Swift 3.0:计时器不会为自己以外的目标射击

时间:2016-09-23 03:53:08

标签: ios swift selector swift3

Timer.scheduledTimer(timeInterval: 5.0, target:self.notificationView, selector: #selector(NotificationView.self.timerFired(_:)), userInfo: nil, repeats: false)

func timerFired(_ timer: Timer) {
        print("Timer Fired")
}
  

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [_ SwiftValue timerFired:]:无法识别的选择器发送到实例0x7fc0baf46f60'

我不明白哪里出错了?如果目标是自我,那么一切正常。

4 个答案:

答案 0 :(得分:1)

问题出在selector语法上,就像这样。

#selector(NotificationView.timerFired(_:))

注意: self适用于当前ViewController,如果您想为其他人设置操作,则需要在您的情况下指定class name.method NotificationView.timerFired {1}}。

答案 1 :(得分:1)

我尝试以下代码并触发 NotificationView.timerFired

class NotificationView {
  @objc func timerFired(_ timer: Timer) {
    print("Timer Fired")
  }
}

class ViewController: UIViewController {
  let notificationView = NotificationView()

  override func viewDidLoad() {
    super.viewDidLoad()

    Timer.scheduledTimer(
      timeInterval: 5.0, 
      target:self.notificationView, 
      selector: #selector(NotificationView.timerFired(_:)), 
      userInfo: nil, 
      repeats: false
    )

  }
}

答案 2 :(得分:0)

检查错误消息的这一部分:

  

[_ SwiftValue timerFired:]

timerFired:是选择器的Objective-C样式表示法。似乎您的#selector(...)正在运作。 (虽然不推荐......)

_SwiftValue是作为选择器目标的对象的类名。这意味着您的目标target:self.notificationView已转换为_SwiftValue

当您将notificationView声明为Optional或隐式解包时,可能会发生这种情况。如果是这样,试试这个:

Timer.scheduledTimer(timeInterval: 5.0, target: self.notificationView!, selector: #selector(NotificationView.timerFired(_:)), userInfo: nil, repeats: false)

(请不要错过!之后的self.notificationView。)

答案 3 :(得分:0)

下面的代码对我有用(在playground / swift 3中):

class SomeClass {

    @objc public func timerFired(_ timer: Timer) {
        print("Timer Fired")
    }
}

let s = SomeClass()

Timer.scheduledTimer(timeInterval: 5.0, target:s, selector: #selector(s.timerFired(_:)), userInfo: nil, repeats: false).fire()
//This also will work
//Timer.scheduledTimer(timeInterval: 5.0, target:s, selector: #selector(SomeClass.timerFired(_:)), userInfo: nil, repeats: false).fire()