程序中常常碰到当用户一定时间未操作时,app需要进行一些变化。
我们知道iOS有一个事件循环机制,也就是大家所说的runloop。我们在对程序进行手势操作时、如点击、滑动、长按、双击等都会响应对应的事件。那么我们就可以利用这个原理监听所有的屏幕事件来实现我们的功能。在程序里负责对用户事件进行处理的是UIApplication。那么如果我们想要做点什么的话,就要继承这个类。然后在里面做一些操作。好了,废话说完。下面上代码。
1、首先创建一个继承UIApplication的类。
#import <UIKit/UIKit.h>
// 定义未操作的时间,也可以从服务器上获取。
#define kApplicationTimeoutInSecond 6
// 超时通知名字
#define kApplicationDidTimeoutNotification @"ApplicationDidTimeout"
@interface SubjectApplication : UIApplication
{
NSTimer *_myidleTimer;
}
- (void)resetIdleTimer;
@end
#import "SubjectApplication.h"
@implementation SubjectApplication
-(void)sendEvent:(UIEvent *)event {
[super sendEvent:event];
if (!_myidleTimer) {
[self resetIdleTimer];
}
NSSet *allTouches = [event allTouches];
if ([allTouches count] > 0) {
UITouchPhase phase= ((UITouch *)[allTouches anyObject]).phase;
if (phase ==UITouchPhaseBegan) {
[self resetIdleTimer];
}
}
}
//重置时钟
-(void)resetIdleTimer {
if (_myidleTimer) {
[_myidleTimer invalidate];
}
//将超时时间由分钟转换成秒数
int timeout = kApplicationTimeoutInMinutes;
_myidleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO];
}
//当达到超时时间,发送 kApplicationTimeoutInMinutes通知
-(void)idleTimerExceeded {
[[NSNotificationCenter defaultCenter] postNotificationName:kApplicationDidTimeoutNotification object:nil];
}
@end
2、修改main.h中代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "SubjectApplication.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([SubjectApplication class]), NSStringFromClass([AppDelegate class]));
}
}
3、在需要使用的地方加上下面的代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil];
-(void)applicationDidTimeout:(NSNotification *)notif {
NSLog (@"超时要进行的操作");
}
通知记得移除哦