我想在不从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]
有什么想法吗?
谢谢
答案 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(){