UITextFieldDelegate vs UITextField control events

Si quiero manejar los cambios a un UITextField, como el usuario que escribe en él; parece que esto se puede hacer asignando un delegado a ese campo de text y luego hacer que el delegado implemente shouldChangeCharactersInRange, o agregando un destino al campo de text y manejando el evento UIControlEventEditingChanged.

Aparte del hecho de que con el método delegado, puede devolver NO y, por lo tanto, impedir 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 methods de delegado apropiados o con los events apropiados. ¿Para qué sirve el delegado de textField si los events de control pueden hacer el trabajo necesario?

Tienes razón; básicamente puedes hacer lo mismo a través de ambos, pero UIControl es de nivel inferior y te permite desviar cada UIEvent particular a diferentes objectives mediante [UIControl addTarget:action:forControlEvents:] donde solo hay un único delegado.

También diría que el protocolo de delegado UITextField está simplemente allí como una alternativa de nivel superior más conveniente 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 de delegado UITextField es bastante similar y, por lo tanto, parece mucho más sencillo con intenciones más definidas que entregar directamente los posts de UIControl.

shouldChangeCharactersInRange se shouldChangeCharactersInRange antes de que ocurra un cambio, y le da la oportunidad de 'cancelar' el cambio. Se llama a UIControlEventEditingChanged después de que se produjo el cambio.

Puede determinar el valor resultante de textField en shouldChangeCharactersInRange , pero debe aplicar manualmente el reemploopString al text existente, utilizando el range suministrado. (a través de NSString stringByReplacingCharactersInRange ). Si desea conocer el text resultante, es más fácil y más eficiente usar UIControlEventEditingChanged .

shouldChangeCharactersInRange se utiliza a menudo para implementar la verificación de validation de input, es decir, puede filtrar caracteres / text pegado a medida que se ingresa. Si un campo es para numbers de teléfono, por ejemplo, puede devolver FALSE si el usuario escribe un carácter no numérico o si intenta pegar un text que no sea numérico.

Puede encontrar un caso en el que pueda reutilizar el código para múltiples controles si puede seguir los UIControlEvent-methods.

Una diferencia key que he encontrado entre los dos enfoques planteados en la pregunta original es que el delegado "shouldChangeCharactersInRange" recibe una llamada ANTES de que cambie el valor en UITextField . El destino para UIControlEventEditingChanged se llama DESPUÉS del cambio en el valor UITextField .

En el caso de que esté utilizando estos events para asegurarse (por ejemplo) de que todos los campos en un cuadro de dialog se hayan completado por completo antes de habilitar un button "Listo", el enfoque de destino puede funcionar mejor para usted. Lo hizo por mí.

El enfoque de delegación es la forma de homogeneizar el comportamiento de UITextField y UITextView .

UITextView no tiene events de control. En contraste, UITextFieldDelegate y UITextviewDelegate proporcionan methods paralelos.

Descubrí que shouldChangeCharactersInRange pasa el mismo NSRange para la inserción y eliminación de text. Anexa un espacio y luego lo elimina, y los parameters de shouldChangeCharactersInRange son indistinguibles de la duplicación del text.

Por shouldChangeCharactersInRange tanto, shouldChangeCharactersInRange realidad no puede pnetworkingecir el text resultante.