WatchKit "unrecognized selector sent to instance" 尝试在 Swift 中触发 NSTimer 对象时

WatchKit "unrecognized selector sent to instance" when trying to fire an NSTimer object in Swift

在我的 WatchKit 扩展 InterfaceController.swift 文件中,我从 awakeWithContext 函数中调用了一个函数,该函数运行动画图像序列。

我使用了 NSTimer 对象来计时延迟,然后触发第二个动画序列。

var nsTimerObject:NSTimer = NSTimer.scheduledTimerWithTimeInterval(showCodeDelay, target: self, selector: "showCode(counterCode1)", userInfo: nil, repeats: false);

第一个动画运行后我收到一个错误,阻止第二个动画被选择器中指定的函数触发:

[Code_Break_WatchKit_Extension.InterfaceController showCode(counterCode1)]: unrecognized selector sent to instance 0x60800014c3f0

我在目标成员

中勾选了iOS设备应用程序和WatchKit扩展

我在堆栈溢出 上找到了 ,这让我走上了这条路。

另一个 似乎建议我可能需要围绕 "Sharing" 做一些事情,但不清楚。

感觉应该很简单,但是我难住了。

我是新手所以请对我温柔点:)

已排序!

问题出在设置 selector 函数和传递函数工作所需参数的语法中。

我改了:

var nsTimerObject:NSTimer = NSTimer.scheduledTimerWithTimeInterval(showCodeDelay, target: self, selector: "showCode(counterCode1)", userInfo: nil, repeats: false);

至:

var nsTimerObject:NSTimer = NSTimer.scheduledTimerWithTimeInterval(showCodeDelay, target: self, selector: "showCode:", userInfo: counterCode1, repeats: false);

然后我不得不更改我的 showCodeDelay 函数声明:

func showCodeDelay(counterCode: Int){

//code........
}

至:

func showCodeDelay(nsTimerObject:NSTimer){
        var tempCounterCode = nsTimerObject.userInfo as! NSNumber
        var counterCode = Int(tempCounterCode)

        //code........
}

我只是在想办法 我一开始错误地认为我只是将 选择器 指向我用其所需参数创建的函数。

然而,当采用这种方法时,选择器中引用的函数看起来必须接收实际的 NSTimer 对象,并从中提取 [=34] 所需的参数=]用户信息

一旦我解决了这个问题,我遇到的下一个问题就是提取我在 userInfo 中传递的值,因为 Xcode 希望我将其视为 AnyObject! 不能表示为 Int 所以我从 中提取了 userInfo nsTimerObject 对象作为 NSNumber 然后向下转换为 Int

可能有更简单、更优雅的方法来实现向下转换,但至少这个方法有效。