2011-02-07 12 views
9

Se si desidera gestire le modifiche a un UITextField, ad esempio l'utente che digita in esso; sembra che questo possa essere fatto sia assegnando un delegato a quel campo di testo, sia facendo in modo che l'attrezzo delegato shouldChangeCharactersInRange, o aggiungendo una destinazione a textField, e gestendo l'evento UIControlEventEditingChanged.UITextFieldDelegate vs UITextField control events

A parte il fatto che con il metodo delegate, è possibile restituire NO e quindi impedire all'utente di apportare la modifica, c'è qualche differenza tra queste 2 cose?

Stessa domanda per gestire l'inizio della modifica o la fine della modifica. Potrebbe essere fatto con i metodi di delega appropriati o con gli eventi appropriati. In cosa consiste effettivamente il delegato textField se gli eventi di controllo possono eseguire il lavoro necessario?

risposta

6

Hai ragione; puoi essenzialmente fare la stessa cosa con entrambi, ma UIControl è di livello più basso e ti consente di sifonare ogni singolo UIEvent a bersagli diversi tramite [UIControl addTarget:action:forControlEvents:] dove c'è un solo delegato.

Direi anche che lo UITextField delegate protocol è semplicemente lì come un'alternativa più comoda e di livello superiore a UIControl/UIEvent come modo per gestire il comportamento di un UITextField.

Il modello di delegati più comune è UITableView DataSource e Delegate e direi che l'utilizzo del protocollo delegato UITextField è abbastanza simile e quindi sembra molto più diretto con intenzioni più definite rispetto alla consegna diretta dei messaggi da UIControl.

9

shouldChangeCharactersInRange viene chiamato prima che si verifichi una modifica e consente di annullare la modifica. UIControlEventEditingChanged viene chiamato dopo che si è verificata la modifica.

È possibile determinare il valore risultante del campo di testo in shouldChangeCharactersInRange, ma è necessario applicare manualmente la stringa di sostituzione al testo esistente, utilizzando l'intervallo fornito. (via NSString stringByReplacingCharactersInRange). Se vuoi conoscere il testo risultante, è più facile e più efficiente usare UIControlEventEditingChanged.

shouldChangeCharactersInRange viene spesso utilizzato per implementare il controllo di convalida dell'input, ovvero è possibile filtrare caratteri/testo incollato non appena inserito. Se un campo è per i numeri di telefono, ad esempio, è possibile restituire FALSE se l'utente digita un carattere non numerico o tenta di incollare il testo che non è numerico.

Si potrebbe trovare un caso in cui è possibile riutilizzare il codice per più controlli se si può rimanere con il UIControlEvent-methods.

1

approccio La delegazione è il modo per omogeneizzare UITextField e UITextView comportamento.

UITextView non ha eventi di controllo. Al contrario, UITextFieldDelegate e UITextviewDelegate forniscono metodi paralleli.

0

Ho scoperto che passa lo stesso NSRange per l'inserimento e la cancellazione del testo. Si aggiunge uno spazio e quindi lo si elimina e i parametri da shouldChangeCharactersInRange non sono distinguibili dalla duplicazione del testo.

Quindi il shouldChangeCharactersInRange non è in grado di prevedere il testo risultante.

6

Una differenza fondamentale che ho trovato tra i due approcci poste nella domanda iniziale è che il delegato "shouldChangeCharactersInRange" viene chiamato PRIMA il valore nei UITextField modifiche. L'obiettivo per UIControlEventEditingChanged viene chiamato DOPO il valore nelle modifiche UITextField.

Nel caso in cui si stiano utilizzando questi eventi per assicurarsi (per esempio) che tutti i campi in una finestra di dialogo siano completamente compilati prima di abilitare un pulsante "Fatto", l'approccio di destinazione potrebbe funzionare meglio. Lo ha fatto per me.