我正在尝试为我使用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];
}
}
上面的代码适用于每一次触摸,但swift的等效代码只适用于UIWindow层次结构之上不存在视图的情况。
有人知道如何检测应用程序中的每一次触摸吗?
3条答案
按热度按时间juzqafwq1#
由于我的应用程序中有类似的问题,我只是尝试修复它:
UIWindow
中的sendEvent
-不起作用sendEvent
-不起作用所以唯一的方法就是提供自定义的
UIApplication
子类。我目前的代码(在iOS 9上运行)是:为什么会有
@objc(MyApplication)
,那是因为Swift用一种与Objective-C不同的方式来处理名字,它只是说--我在Objective-C中的类名是MyApplication
。要使它工作,打开你的info.plist并添加一行 Principal class 键和
MyApplication
值(MyApplication
是@objc(...)
里面的内容,而不是你的Swift类名)。m2xkgtsf2#
UIWindow
也有一个可以覆盖的sendEvent
方法,它可以让你追踪自上次触摸屏幕以来的时间。Swift 4:如果您使用的是故事板,则可以将其加载到
didFinishLaunchingWithOptions
中:现在,您可以在应用的其他位置检查非活动状态,如下所示:
jtjikinw3#
@markiv的回答很有魅力,有两个问题:
可以这样解决:
let kw = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
找到here请参阅@matt答案
一个可以子类化UIWindow -找到了答案here。将其与IdlingWindow类组合。
留言不见了。