我正在尝试为使用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();
}
}
}
在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];
}
}
上面的代码可用于每次触摸,但是仅当UIWindow的层次结构上方不存在视图时,快速等效项才有效吗?
有谁知道一种检测应用程序中每一次触摸的方法?
由于我的应用程序中有类似内容,因此我尝试对其进行修复:
sendEvent
在UIWindow
-不工作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)
}
}
为什么有@objc(MyApplication)
。那是因为Swift用一种不同于Objective-C的方式来命名名称,它只是说-我在Objective-C中的类名称是MyApplication
。
要使其正常工作,请打开info.plist并添加具有Principal类键和MyApplication
值的行(MyApplication
是内部内容@objc(...)
,而不是Swift类名称)。原始密钥为NSPrincipalClass
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句