2015-11-16 1 views
0

Je souhaite autoriser l'utilisateur à entrer des notes dans un UITextView avant de fermer une application. Mais il/elle pourrait ne pas entrer n'importe quoi ou il/elle pourrait entrer un certain texte et puis arrêter et ne rien faire pendant longtemps. Dans l'un ou l'autre de ces cas, je souhaite fermer UITextView, enregistrer des éléments et quitter l'application. Comment puis-je détecter que l'utilisateur n'a rien entré pendant un certain nombre de secondes?Comment faire un minuteur inactif qui détecte l'activité d'édition dans un UITextView

J'ai essayé d'envoyer une fonction après un temps d'attente

static int idleSeconds = 8; 

self.noteDoneTime = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * idleSeconds); 
dispatch_after(self.noteDoneTime, dispatch_get_main_queue(), ^{ [self endNoteRequest]; }); 

mais à chaque fois que l'utilisateur modifie le texte renouveler le temps d'expédition:

- (void)textViewDidChange:(UITextView *)textView { 
    if (textView == self.noteView) { 
     self.noteDoneTime = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * idleSeconds); 
    } 
} 

Mais cela ne fonctionne pas parce que l'envoi l'heure n'est pas mise à jour après son initialisation, donc la méthode 'endNoteRequest' s'exécute même si l'utilisateur continue à éditer le texte. Je pense que je dois annuler la demande d'expédition et en émettre une nouvelle, mais comment puis-je faire cela?

Ou existe-t-il une autre approche pour un délai d'inactivité qui fonctionne réellement?

Répondre

1

Je fais quelque chose comme ça dans une application de jeu, où je pénalise l'utilisateur toutes les 10 secondes qui s'écoulent sans que l'utilisateur ne bouge. C'est comme une «horloge de tir» en basket-ball, remise à zéro après chaque tir.

Il est plus facile de le faire avec un NSTimer, car vous disposez maintenant d'un objet auquel vous pouvez conserver une référence (par exemple, une propriété d'instance). Lorsque l'utilisateur tape quelque chose, vous invalidez la minuterie et définissez votre référence à zéro. Maintenant c'est parti! Maintenant, faites-en un nouveau et définissez la référence. Etc.

+0

Merci. J'ai pensé à cela mais j'ai vu quelque part dans la documentation que les NSTimers sont gourmands en énergie et ne devraient être utilisés qu'en dernier recours, et que nous devrions plutôt utiliser des méthodes de répartition. Mais peut-être NSTimer est le seul moyen. J'aimerais vraiment trouver un moyen d'annuler une demande d'envoi. Je vais attendre un moment pour voir si quelqu'un répond avec des informations sur l'annulation d'une demande d'envoi, ou la mise à jour de l'heure qu'il déclenche. – RobertL

+0

Je viens de voir la question 15005452 qui ressemble à un moyen de replanifier une demande de répartition. J'y reviendrai plus tard ce soir. – RobertL

+0

J'ai une classe de minuterie d'expédition annulable ici: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk1ch12p499timerLeaker2/ch12p325NotificationLeaker/CancelableTimer.swift mais je pense que l'objection "énergie affamée" à NSTimer est un non-sens. – matt