【发布时间】:2016-01-30 14:15:27
【问题描述】:
我正在用 Swift 为 iOS 9.2 编写一些计时器代码 我通过 xcode 下载了最新的 iOS 9.2 文档 他们显示
(void)timerFireMethod:(NSTimer *)timer
但这行不通。 如果我使用这样的签名
func timerFire(timer : NSTimer?)
func timerFire(timer : NSTimer)
然后我得到错误
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DSP1.PlayManager timerFire]: unrecognized selector sent to instance
我唯一能开始工作的就是这样的呼叫签名
func play(sound : String)
{
bsound = theLM?.getPlayer(sound)
bsound?.delegate = self
bsound?.play()
stimer = NSTimer(timeInterval: 1.0, target: self, selector: Selector("timerFire"), userInfo: self, repeats: true)
NSRunLoop.currentRunLoop().addTimer(stimer!, forMode: NSDefaultRunLoopMode)
}
// Docs say signature should be (void)timerFireMethod:(NSTimer *)timer. Docs are wrong
func timerFire()
{
print("Player at: \(bsound?.currentTime) out of \(bsound?.duration) seconds");
}
但这与通过 XCode 下载的最新 iOS 9.2 文档所说的不匹配。
- 我这样做对吗?
- 为什么新加载的 iOS 9.2 文档似乎有错误的签名?
- 其他人在阅读哪些有关 Swift iOS 编程的准确文档?
(编辑更清楚的是文档中列出的回调签名在运行时无法工作)
答案:
在对 NSTimer 的调用中,如果作为 Selector 传入的函数名称有一个尾随冒号,则表示您希望将计时器作为参数传递给您的方法。没有冒号意味着您不希望将计时器作为参数传递。
NSTimer(timeInterval: 1.0, target: self, selector: Selector("timerFire"), userInfo: self, repeats: true)
func timerFire()
或
NSTimer(timeInterval: 1.0, target: self, selector: Selector("timerFire:"), userInfo: self, repeats: true)
func timerFire(timer : NSTimer)
NSTimer 的文档在选择器参数中提到了这一点,但还不清楚。 "选择器应具有以下签名:timerFireMethod:(包括一个冒号,表示该方法接受一个参数)。"
【问题讨论】: