iOS – Execute a ação se não houver interação do usuário em uma duração específica

Primeiro, crie uma constante para lidar com a duração do tempo limite em segundos e uma instância NSTimer para detecção de inatividade.

// in your SomeViewController.h file
// ...

#define kTimeoutUserInteraction 3

// ...

NSTimer *idleTimer;

Em .m, adicionando essas funções

// in your SomeViewController.m file
// ...

# pragma mark timer

- (void)resetIdleTimer {
if (!idleTimer) {
idleTimer
= [NSTimer scheduledTimerWithTimeInterval:kTimeoutUserInteraction target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:idleTimer forMode:NSDefaultRunLoopMode];
} else {
if (fabs([idleTimer.fireDate timeIntervalSinceNow]) < kTimeoutUserInteraction - 1.) {
idleTimer
.fireDate = [NSDate dateWithTimeIntervalSinceNow:kTimeoutUserInteraction];
}
}
}

- (void)idleTimerExceeded {
idleTimer
= nil;
// do something
[self resetIdleTimer];
}

- (UIResponder *)nextResponder {
[self resetIdleTimer];
return [super nextResponder];
}

// ...

em suma, nextResponderé chamado em toda interação do usuário. Em resetIdleTimer, idleTimeré verificado idleTimerse está desatualizado ou não, e será renovado se estiver desatualizado. \ do somethingé chamado quando o cronômetro é excedido.