这里用定时器的一个静态函数触发一个动作。 很多人说用来代替 performSelector。后者不熟悉,不说了。
目标是,我在视图里面获得鼠标事件,将这个事件转换成一个位置, 然后传给上层的windowcontroller 处理动作。
要做到这些,我查了下,可以有几种办法。可以使用委托,也可以转换windowcontroller的类型然后调用它的方法。定时器的方法看起来比较好。
初看起来也简单。定时器还有别的能力,这里就不提了。单说下面这个静态函数。
NSTimer.scheduledTimerWithTimeInterval( 2.3, target: self, selector: "wobbleOval",
userInfo: nil, repeats: false)
这个函数调用的时候,需要给出间隔时间,触发目标,Selector, 用户信息和是否重复的标志。但是实际用得时候,我却遇到了不少麻烦。
这里有些诡异的细节需要说明白。一旦明白就简单了。
- target 程序目标,多数例子都是传给self的,如果要传给上方的window controller,需要这样: self.window!.windowcontroller.
- selector 的名称。这里面有个鬼点,如果没有参数,那么这个名称就不要冒号。如果要传递参数,响应的名称后面要由冒号。
class GoWindowController: NSWindowController, NSWindowDelegate {
func PutdownStone( timer: NSTimer) {
// let doc = self.document as! Document
let sss = "sss"
let a = timer.userInfo
print(sss)
print(a)
}
}
自定义NSView 子类 {
override func mouseDown(theEvent: NSEvent) {
let eyeCenter = self.convertPoint(theEvent.locationInWindow, fromView: nil)
let (x, y): (Int, Int) = getGoPositionByMouse( eyeCenter )
if x > 0 && x < Int(lineCount) && y > 0 && y < Int(lineCount){
let aaa = 23
NSTimer.scheduledTimerWithTimeInterval( 0.3, target: self.window!.windowController!, selector: "PutDownStone:",
userInfo: aaa, repeats: false)
}
}