NSTimer找不到选择器

时间:2015-01-12 21:59:31

标签: swift nstimer

我想在不从UIViewVontroller继承的类中使用NSTimer。我有2个文件:ViewController和类似的TimerClass:

的ViewController:

import UIKit

class ViewController: UIViewController {

    var timerClass = TimerClass()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(animated: Bool) {
        timerClass.launchTimer()
    }

}

TimerClass:

import Foundation

class TimerClass {

    var timer = NSTimer()

    init(){}

    func launchTimer(){
        var timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "timerEnd", userInfo: nil, repeats: true)
    }

    func timerEnd(){
        println("That worked")
    }
}

当我启动该应用时,我遇到了崩溃:

2015-01-12 19:48:24.322 Timer_TEST [5829:185651] *** NSForwarding:警告:类'Timer_TEST.TimerClass'的对象0x7fbc3be20710没有实现methodSignatureForSelector: - 提前出现问题 无法识别的选择器 - [Timer_TEST.supportFile timerEnd]

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:29)

编辑:请注意,从Swift 2.2开始,您将无法犯这个错误!您将使用新的#selector语法(请参阅https://stackoverflow.com/a/35658335/341994),编译器将不允许您为未向Objective-C公开的方法形成选择器。


这只是将Swift函数暴露给Objective-C以使其对Objective-C可见的问题。您有四种选择:

  • 让TimerClass从NSObject继承(并删除init实现):

    class TimerClass : NSObject {
    
  • 使用@objc声明TimerClass [不在Swift 2.0中;改为使用之前的选择]:

    @objc TimerClass {
    
  • 使用@objc声明函数:

    @objc func timerEnd()
    
  • 声明函数dynamic(这可能是最糟糕的选择,因为它是不必要的 - 函数动态;它不需要通过以下方式进行更改Objective-C,它只需要可见):

    dynamic func timerEnd(){