2010-08-10 7 views
2

Je dois être capable de détecter les événements tactiles sur le clavier. J'ai une application qui affiche un écran qui se produit après une certaine période d'inactivité (pas d'événements tactiles) Pour résoudre ce problème, j'ai sous-classé mon UIWindow et implémenté la fonction sendEvent, qui me permet d'obtenir des événements tactiles sur l'ensemble de l'application mettre en œuvre la méthode en un seul endroit. Cela fonctionne partout à côté lorsque le clavier est présenté et que l'utilisateur tape sur le clavier. Ce que je dois savoir, c'est qu'il existe un moyen de détecter les événements tactiles sur le clavier, un peu comme ce que sentEvent fait pour uiWindow. Merci d'avance.iphone keyboard touch events

+0

Pouvez-vous poster le code qui vérifie que l'écran est inactif. Je fais la même chose. Je voulais juste savoir que vous utilisez timer sur appdelegate pour vérifier que l'utilisateur est actif ... – iPhoneDev

+0

voir ma réponse ci-dessous. – Bittu

Répondre

4

trouvé une solution au problème. Si vous observez les notifications suivantes, vous pouvez obtenir un événement lorsque vous appuyez sur la touche. J'ai ajouté ces notifications dans ma classe uiwindow personnalisée, donc le faire en un seul endroit me permettra d'obtenir ces événements tactiles tout au long de l'application.

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextFieldTextDidChangeNotification object: nil]; 
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextViewTextDidChangeNotification object: nil]; 

- (void)keyPressed:(NSNotification*)notification 
{ [self resetIdleTimer]; } 

de toute façon, espérons que cela aide quelqu'un d'autre.

0

iPhoneDev: voici ce que je fais.

J'ai un objet UIWindow personnalisé. Dans cet objet, il y a un NSTimer qui est réinitialisé chaque fois qu'il y a un contact. Pour obtenir cette touche, vous devez remplacer la méthode sendEvent de UIWindow.

c'est ce que la méthode sendEvent ressemble dans ma fenêtre personnalisée classe:

- (void)sendEvent:(UIEvent *)event 
{ 
    if([super respondsToSelector: @selector(sendEvent:)]) 
    { 
     [super sendEvent:event]; 
    } 
    else 
    { 
     NSLog(@"%@", @"CUSTOM_Window super does NOT respond to selector sendEvent:!"); 
     ASSERT(false); 
    } 

    // 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) 
    { 
     // anyObject works here. 
     UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase; 
     if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded) 
     { 
      [self resetIdleTimer]; 
     } 
    } 
} 

est ici le resetIdleTimer:

- (void)resetIdleTimer 
{ 
    if (self.idleTimer) 
    { 
     [self.idleTimer invalidate]; 
    } 
    self.idleTimer = [NSTimer scheduledTimerWithTimeInterval:PASSWORD_TIMEOUT_INTERVAL target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]; 
} 

après, dans le idleTimerExceeded, je vous envoie un message à la délégués de fenêtre, (dans ce cas, l'appDelegate).

- (void)idleTimerExceeded 
{ 
    [MY_CUSTOM_WINDOW_Delegate idleTimeLimitExceeded]; 
} 

Lorsque je crée cet objet fenêtre personnalisé dans le appDelegate, je mis le appDelegate en tant que délégué pour cette fenêtre. Et dans la définition appDelegate de idleTimeLimitExceeded est l'endroit où je fais ce que j'ai à l'expiration du timer. La clé est de créer la fenêtre personnalisée et de surcharger la fonction sendEvent. Combinez cela avec les deux notifications de clavier ci-dessus que j'ai ajoutées dans la méthode init de la classe de fenêtre personnalisée et vous devriez être capable d'obtenir 99% de tous les événements tactiles à l'écran n'importe où dans l'application.