2016-09-23 74 views
0
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'雨燕3.0:计时器不烧其他目标不是自我

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

+0

也许这:http://stackoverflow.com/questions/39622721/how-initialize-a-timer-inside-a-custom-class-in-swift? –

回答

0

检查您的错误信息,这部分:

[_SwiftValue timerFired:]

timerFired:是选择的一个Objective-C风格的符号。似乎你的#selector(...)正在工作。 (虽然不推荐...)

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

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

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

(请不要self.notificationView后错过!

+0

谢谢。这实际上是非常愚蠢的错误。有效。 –

+0

@PawanKumarSingh,编译器应该检测到这类错误并警告我们。许多开发人员正在忍受这种'_SwiftValue'的事情。您可以将其称为缺陷并向[Apple](http://developer.apple.com/bug-reporting/)发送错误报告。 – OOPer

1

问题是你的selector语法就是这样。

#selector(NotificationView.timerFired(_:)) 

注:self是当前ViewController如果你想设置其它的动作,那么你需要指定你的情况class name.method它是NotificationView.timerFired

+0

两者都是一样的。在发布问题之前,我尝试了两个代码。我认为它的swift3.0的bug。 Timer.scheduledTimer(timeInterval:5.0,target:self.notificationView,selector:#selector(NotificationView.timerFired(_ :)),userInfo:nil,repeats:false) –

+0

您是否尝试了Martin R的建议。 –

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 
    ) 

    } 
} 
0

的代码在下面为我工作(在操场/迅速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()