我想在不从UIViewVontroller继承的类中使用NSTimer.我有2个文件:一个ViewController和一个类似的TimerClass:
视图控制器:
import UIKit
class ViewController: UIViewController {
var timerClass = TimerClass()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
timerClass.launchTimer()
}
}
Run Code Online (Sandbox Code Playgroud)
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")
}
}
Run Code Online (Sandbox Code Playgroud)
当我启动该应用程序时,我遇到了崩溃:
2015-01-12 19:48:24.322 Timer_TEST [5829:185651]***NSForwarding:警告:类'Timer_TEST.TimerClass'的对象0x7fbc3be20710没有实现methodSignatureForSelector: - 提前故障无法识别的选择器 - [Timer_TEST.supportFile timerEnd]
任何的想法?
谢谢
mat*_*att 29
编辑:请注意,从Swift 2.2开始,你将无法犯这个错误!您将使用新#selector语法(请参阅/sf/answers/2496083481/),编译器将不允许您为未向Objective-C公开的方法形成选择器.
这只是将Swift函数暴露给Objective-C以使其对Objective-C可见的问题.你有四个选择:
使TimerClass从NSObject继承(并删除init实现):
class TimerClass : NSObject {
Run Code Online (Sandbox Code Playgroud)使用@objc[不在Swift 2.0中声明TimerClass ; 改为使用前面的选择]:
@objc TimerClass {
Run Code Online (Sandbox Code Playgroud)用以下函数声明函数@objc:
@objc func timerEnd()
Run Code Online (Sandbox Code Playgroud)声明函数dynamic(这可能是最糟糕的选择,因为它是不必要的 - 函数不是动态的;它不需要通过Objective-C就地改变,它只需要可见):
dynamic func timerEnd(){
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3448 次 |
| 最近记录: |