如何检测Swift 2中的所有触摸

Fir*_*ule 5 timeout touch ios appdelegate swift2

我正在尝试为我正在使用Swift 2开发的应用程序创建超时功能,但在swift 2中,您可以将此代码放在应用程序委托中并且它可以工作,但它不会检测到任何键盘按下,按钮按下,文本字段按下, 等等:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesBegan(touches, withEvent: event);
    let allTouches = event!.allTouches();

    if(allTouches?.count > 0) {
        let phase = (allTouches!.first as UITouch!).phase;
        if(phase == UITouchPhase.Began || phase == UITouchPhase.Ended) {
            //Stuff
            timeoutModel.actionPerformed();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在swift 2之前,我能够拥有AppDelegate子类UIApplication并覆盖sendEvent:像这样:

-(void)sendEvent:(UIEvent *)event
{
    [super sendEvent:event];

    // Only want to reset the timer on a Began touch or an Ended touch, to reduce the number of timer resets.
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] > 0) {
        // allTouches count only ever seems to be 1, so anyObject works here.
        UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
        if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded)
            [[InactivityModel instance] actionPerformed];
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于每次触摸,但只有在UIWindow的层次结构之上不存在视图时,swift等效项才有效吗?

有没有人知道检测应用程序中每一次触摸的方法?

zrz*_*zka 15

由于我在我的应用程序中有类似的东西,我只是试图解决它:

  • 覆盖sendEventUIWindow-不工作
  • sendEvent委托中的覆盖- 不起作用

所以唯一的方法是提供自定义UIApplication子类.到目前为止,我的代码(适用于iOS 9)是:

@objc(MyApplication) class MyApplication: UIApplication {

  override func sendEvent(event: UIEvent) {
    //
    // Ignore .Motion and .RemoteControl event
    // simply everything else then .Touches
    //
    if event.type != .Touches {
      super.sendEvent(event)
      return
    }

    //
    // .Touches only
    //
    var restartTimer = true

    if let touches = event.allTouches() {
      //
      // At least one touch in progress?
      // Do not restart auto lock timer, just invalidate it
      //
      for touch in touches.enumerate() {
        if touch.element.phase != .Cancelled && touch.element.phase != .Ended {
          restartTimer = false
          break
        }
      }
    }

    if restartTimer {
      // Touches ended || cancelled, restart auto lock timer
      print("Restart auto lock timer")
    } else {
      // Touch in progress - !ended, !cancelled, just invalidate it
      print("Invalidate auto lock timer")
    }

    super.sendEvent(event)
  }

}
Run Code Online (Sandbox Code Playgroud)

为什么会这样@objc(MyApplication).那是因为Swift以与Objective-C不同的方式破坏了名称 - 它只是说 - 我在Objective-C中的类名是MyApplication.

要使其工作,请打开info.plist并添加具有Principal类键和MyApplication值的行(MyApplication内部是什么@objc(...),而不是Swift类名).原始的关键是NSPrincipalClass.

在此输入图像描述