2011-11-24 12 views
5

Estoy escribiendo mi primera aplicación para iPhone, y he estado explorando los patrones de diseño en Cocoa Touch y Objective-C. Vengo de un entorno de desarrollo web del lado del cliente, así que estoy tratando de entender a los delegados.Delegados vs. eventos en Cocoa Touch

Específicamente, no veo por qué se necesitan objetos delegados en lugar de manejadores de eventos. Por ejemplo, cuando el usuario presiona un botón, se maneja con un evento (UITouchUpInside), pero cuando el usuario termina de ingresar a un cuadro de texto y lo cierra con el botón 'Listo', la acción se maneja llamando a un método en el delegado del cuadro de texto (textFieldShouldReturn).

¿Por qué utilizar un método delegado en lugar de un evento? También veo esto en el controlador de vista con el método viewDidLoad. ¿Por qué no usar eventos?

Respuesta

6

EDIT: Otro buen mensaje: NSNotificationCenter vs delegation(using protocols)?

Un delegado es una devolución de llamada por lo que hay una relación 1: 1. El delegado es una instancia única de un objeto que implementa un protocolo formal.

Las notificaciones (eventos) son básicamente transmisiones a muchos objetos que están interesados ​​cuando sucede algo.

Delegados son buenas para ser capaz de intercalar código en la tubería de algunos otros objetos de proceso, tal como antes y después de devoluciones de llamada, proporcionando fuentes de datos para un control y la comunicación entre las vistas:

What exactly does delegate do in xcode ios project?

Por lo tanto delegados tienen una relación mucho más estrecha con el objeto ya que son el único objeto proporcionado para interponer y alterar el procesamiento del objeto o proporcionar datos. Está posponiendo las decisiones y las operaciones externas, como cargar datos a algún otro objeto, por lo que es un patrón muy común para las clases genéricas de UIKit. Las notificaciones a otros objetos son una relación mucho más relajada, es solo que notifica a otros que sucedió algo.

Tampoco es necesariamente una pregunta "vs". Por ejemplo, podría tener una aplicación que realiza el procesamiento en segundo plano y activó una notificación cambiada que hace que una vista llame a su delegado de fuente de datos para actualizar su vista. Son dos mecanismos diferentes.

4

Una distinción clara es que los métodos de delegado pueden tener valores de retorno ya que existe una relación de uno a uno. Por otro lado, los eventos están vagamente asociados a la clase de envío, a la que generalmente no le importa si algo responde o no.

Otros métodos de delegado están simplemente ahí por conveniencia y pueden tener los eventos correspondientes que también se activan.

5

Los eventos y delegados tienen dos propósitos diferentes, por lo tanto, verá los dos utilizados.

Si solo desea presionar su botón para disparar un mensaje, un evento está bien. Si desea que su Hecho presione para validar el contexto del campo de texto antes de que se le permita perder el foco, puede usar el método de delegado textFieldShouldReturn para manejar cualquier validación y devolver NO si no valida.

Los delegados realmente le permiten cambiar el comportamiento sin crear subclases. Están llenos con si y hicieron métodos para este propósito.Implementa estos métodos en lugar de anular los métodos de acción cuando desea validar, notificar o procesar antes y/o después de la acción.

Si cree que necesita subclase de un objeto UIKit, primero compruebe sus métodos delegados. Lo más probable es que ya haya un lugar para poner su comportamiento personalizado.

Cuestiones relacionadas