2013-08-16 7 views
5

Sperando che qualcuno possa far luce su questo.Eseguire azioni dopo un leggero ritardo durante la digitazione in UITextField

Sto lavorando a un'app per un'azienda e hanno un campo di ricerca che è un UITextField personalizzato. Attualmente raffina la ricerca con ogni lettera inserita.

Problema: hanno un piccolo popup che indica che è in ricerca e con ogni pressione di un tasto, lo vedete lampeggiare sullo schermo e fuori dallo schermo. Loro non lo vogliono, ovviamente.

Quello che stavo pensando di fare anche se non sono sicuro di come, è invece di perfezionare la ricerca su ogni tasto premuto, cercando quando hanno finito di digitare. MA, anche io non voglio dover aggiungere un pulsante "Cerca". Voglio solo che finiscano di digitare, un secondo, un ritardo o qualcosa del genere, la ricerca avviene.

C'è un modo per rilevare quando l'utente ha terminato la digitazione? Qualcuno ha fatto questo?

Grazie in anticipo.

+0

Eventuali duplicati di [? Come rilevare una pausa in ingresso per UISearchBar/UITextField] (http://stackoverflow.com/questions/7061377/how-to-detect -a-pause-in-input-per-uisearchbar-uitextfield) – Cristik

risposta

7

Probabilmente si potrebbe fare questo con un semplice NSTimer. In shouldChangeCharactersInRange: controllare se il timer è valido e se lo è, invalidarlo, quindi riavviare il timer. Quando il tempo è finalmente forte, significa che l'utente non ha digitato nulla nell'intervallo specificato per l'ora.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 

    return YES; 
} 

Come @Jai Govindani sottolineato al fine di attuare questo metodo, è necessario assegnare il controller come il delegato del del vostro UITextField e assicurarsi che il controller conforme al protocollo UITextFieldDelegate.

+0

non dimenticare di impostare prima te stesso come delegato di UITextField, ovviamente –

+0

Questo ha senso ed è un ottimo inizio ma sto diventando un incidente. Probabilmente a causa di un problema di inizializzazione? Digito una prima lettera sul campo, non succede nulla (anche dopo un ritardo). Digita una seconda lettera nel campo, crash! EXC_BAD_ACCESS errore. Mi sento come se fossi qui vicino. – r0ddy

+0

@ r0ddy È difficile dire qual è il problema, ma una volta che tutto è allineato correttamente, questo approccio dovrebbe funzionare come si desidera. –

0

si può provare nel seguente modo

[self performSelector:<your selector> withObject:<object if you want to pass anything> afterDelay:<time delay>]; 

in UITextField metodo delegato

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
+0

Questo ritarderebbe ogni aggiornamento piuttosto che ritardare tutto fino a quando l'utente non ha finito di digitare. –

+0

@ 0x7fffffff Ok. Ho capito il mio errore. Chiamerà il selettore più volte. Ho concordato che è una risposta sbagliata. – Exploring

5

Con il metodo timerWithTimeInterval: Obiettivo: selettore: userInfo: ripete: è necessario aggiungere il timer al runloop. Avevo bisogno di modificare la risposta come segue:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:someTimer forMode:NSDefaultRunLoopMode]; 
    return YES; 
}