2011-02-07 11 views
9

Si deseo manejar cambios en un UITextField, como el usuario que lo escribe; parece que esto se puede hacer asignando un delegado a ese campo de texto y luego haciendo que el delegado implemente shouldChangeCharactersInRange, o agregue un destino al textField, y maneje el evento UIControlEventEditingChanged.UITextFieldDelegate vs UITextField eventos de control

Aparte del hecho de que con el método de delegado, puede devolver NO y para evitar que el usuario realice la edición, ¿hay alguna diferencia entre estas 2 cosas?

La misma pregunta para manejar el comienzo de la edición o el final de la edición. Se podría hacer con los métodos delegados apropiados o con los eventos apropiados. ¿Para qué sirve en realidad el delegado textField si los eventos de control pueden hacer el trabajo necesario?

Respuesta

6

Tienes razón; esencialmente puede hacer lo mismo a través de ambos, pero UIControl es de nivel inferior y le permite desviar cada UIEvent en particular a diferentes objetivos a través del [UIControl addTarget:action:forControlEvents:], donde solo hay un delegado.

También diría que el UITextField delegate protocol es simplemente como una alternativa más conveniente y de mayor nivel a UIControl/UIEvent como una forma de gestionar el comportamiento de un UITextField.

El patrón de delegado más común es UITableView DataSource y Delegate, y yo diría que usar el protocolo delegado UITextField es bastante similar y por lo tanto se ve mucho más directo con intenciones más definidas que la entrega directa de los mensajes de UIControl. Se llama a

9

shouldChangeCharactersInRange antes de que se produzca un cambio, y le da la oportunidad de 'cancelar' el cambio. UIControlEventEditingChanged se invoca después de que se produjo el cambio.

Puede determinar el valor resultante de textField en shouldChangeCharactersInRange, pero debe aplicar manualmente el replacementString al texto existente, utilizando el rango proporcionado. (a través de NSString stringByReplacingCharactersInRange). Si desea saber el texto resultante, es más fácil y más eficiente usar UIControlEventEditingChanged.

shouldChangeCharactersInRange se usa a menudo para implementar la verificación de validación de entrada, es decir, puede filtrar caracteres/texto pegado a medida que se ingresa. Si un campo es para números telefónicos, por ejemplo, puede devolver FALSE si el usuario escribe un carácter no numérico o intenta pegar texto que no sea numérico.

Es posible encontrar un caso en el que se puede reutilizar el código para múltiples controles si se puede seguir con el UIControlEvent-methods.

1

enfoque La delegación es la manera de homogeneizar UITextField y UITextView comportamiento.

UITextView no tiene eventos de control. Por el contrario, UITextFieldDelegate y UITextviewDelegate proporcionan métodos paralelos.

0

He descubierto que shouldChangeCharactersInRange pasa el mismo NSRange para la inserción y eliminación de texto. Agrega un espacio y luego lo elimina, y los parámetros de shouldChangeCharactersInRange no se pueden distinguir de la duplicación del texto.

En realidad, shouldChangeCharactersInRange no puede predecir el texto resultante.

6

Una diferencia clave que he encontrado entre los dos enfoques planteados en la pregunta original es que el delegado "shouldChangeCharactersInRange" se llama ANTES el valor de los UITextField cambios. El objetivo para UIControlEventEditingChanged se llama DESPUÉS cambia el valor en UITextField.

En el caso de que esté utilizando estos eventos para asegurarse (por ejemplo) de que todos los campos de un cuadro de diálogo estén completados antes de habilitar un botón "Listo", el enfoque objetivo puede funcionar mejor para usted. Lo hizo por mi