使用定时器发送Action

这里用定时器的一个静态函数触发一个动作。 很多人说用来代替 performSelector。后者不熟悉,不说了。

目标是,我在视图里面获得鼠标事件,将这个事件转换成一个位置, 然后传给上层的windowcontroller 处理动作。

要做到这些,我查了下,可以有几种办法。可以使用委托,也可以转换windowcontroller的类型然后调用它的方法。定时器的方法看起来比较好。

初看起来也简单。定时器还有别的能力,这里就不提了。单说下面这个静态函数。

       NSTimer.scheduledTimerWithTimeInterval( 2.3, target: self, selector: "wobbleOval",

            userInfo: nil, repeats: false)


这个函数调用的时候,需要给出间隔时间,触发目标,Selector, 用户信息和是否重复的标志。但是实际用得时候,我却遇到了不少麻烦。

这里有些诡异的细节需要说明白。一旦明白就简单了。

  1. target 程序目标,多数例子都是传给self的,如果要传给上方的window controller,需要这样: self.window!.windowcontroller.
  2. selector 的名称。这里面有个鬼点,如果没有参数,那么这个名称就不要冒号。如果要传递参数,响应的名称后面要由冒号。
      selector: "wobbleOval"    --》对应的响应函数   fun wobbleOvar()
      selector: "wobbleOval:"    --》对应的响应函数  fun wobbleOvar( timer:NSTimer 
      
     传递参数: user info, 这是一个anyobject 对象。你可以用任何东西。它被保存在timer里面,作为一个属性。
     你可以从相应函数里面取到它。下面是一个实际的演示的例子。

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)

        }

    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值