2012-01-06 16 views
8

¡He intentado resolver esto, lo prometo! ¡Hay una gran cantidad de información sobre esto y todavía estoy inundado en un mar de conceptos abstractos! Es como cuando era un niño y nadie podía explicarme por qué un país no podía simplemente imprimir más dinero y ser realmente rico. No soy tan retrasado con la mayoría de estas cosas, pero por alguna razón no puedo entender este concepto, por lo que realmente apreciaría si alguien pudiera deletrear como condescendiente "hablar con un niño de 4 años" lentamente como sea posible !Protocolos y delegados para Dummies

Creo que la acción objetivo tiene mucho sentido para mí. Es una forma útil de permitir que una vista hable con un controlador, sin tener que hacer mucho. Por lo que puedo decir, un objeto controlador efectivamente conecta un oyente al objeto de vista de modo que si un evento en particular ocurre en esa vista (es decir, botón presionado) se dispara el método del controlador. Esto puede no ser técnicamente preciso, pero como explicación abstracta tiene sentido para mí.

Así que la secuencia es:

  1. Un método de destino se crea en el objeto controlador.
  2. Se selecciona una vista y se conecta gráficamente a ese método.
  3. Ocurre un evento en esa vista que dispara el método desde el controlador.

Los protocolos y los delegados me han desconcertado. Sé que tiene algo que ver con permitir que los objetos hablen entre sí, pero traté de escribir mi (falta de) comprensión tan abajo y simplemente la eliminé, ya que creo que es mejor no deshacer los nudos en mi pensamiento actual, sino simplemente limpie la pizarra y comience de nuevo. Si alguien tuviera a bien pasar un poco de tiempo a explicar el propósito de

  1. El uso de delegados/protocolos en lugar de apuntar/acción
  2. Los constituyentes del código, y donde vive
  3. La secuencia de eventos que ocurren cuando el proceso se está utilizando

Estaría eternamente agradecido.

A juzgar por algunos de los comentarios sobre otras explicaciones, siento que no soy el único un poco perdido, así que espero que esto sea de uso general. ¡Muchas gracias!

Editar:

bien como pensaba que tal vez si sólo me tiendo a cabo mi entendimiento personas me pueden corregir, y podría hacer esto más fácil.

Mi muestra está tomada del Apple Docs, con una ventana como objeto de vista y WindowDelegate como delegado, donde un clic en el botón Cerrar ventana desencadena un "¿debo cerrar?" mensaje al delegado.

constituyentes del Código: Ventana (Ver) WindowDelegate (Vista Controlador?)

  1. declarar el protocolo que un delegado puede utilizar en la sección de interfaz de la ventana (Ver).
  2. Crea una instancia del delegado en la ventana.
  3. Indique que WindowDelegate implementa el protocolo de ventana, incluyendo: en su interfaz. (Algo inestable aquí?)
  4. Escriba la implementación necesaria de los métodos en la sección de implementación de WindowDelegate (View Controller).
  5. En un determinado evento, la ventana enviará un mensaje a WindowDelegate con cierta información.
  6. WindowDelegate procesará esto y devolverá una respuesta.

¿En cualquier lugar en la línea derecha?

+2

relacionado: http://stackoverflow.com/questions/6148148/delegates-what-are-they-really/6148838#6148838 – justin

Respuesta

-1

Para los delegados, puede consultar this question.

Para los protocolos es posible que desee comprobar this question o consulte el documentation.

Espero que esto ayude!

+0

gracias, me llevó a un par de cosas que aún no había visto, todavía luchando sin embargo. – Alan

3

Hay un montón de cosas aquí y parece que tienes algunas cosas confundidas.

En primer lugar, le sugiero que vaya al sitio del desarrollador de Apple y descargue los libros Learning Objective-C: A Primer y Objective-C Programming Language. Ignore el material de cableado de la interfaz de destino/acción por el momento, ya que parece que necesita comprender algunos conceptos básicos del Objetivo C. Aquí encontrará toda la información sobre los Protocolos, etc. y otras cosas orientadas a objetos.

En segundo lugar, hay varios libros muy buenos que lo llevarán paso a paso a desarrollar una aplicación. Comienzo del desarrollo de iPhone 4: explorar el SDK de iOS es uno que está bien considerado. También es aquí donde encontrará información sobre los delegados.

En tercer lugar, dedique un poco más de tiempo a la documentación. La documentación de SDK tiene muchos artículos que describen cómo funcionan las cosas desde un nivel muy básico y el sitio para desarrolladores de Apple también tiene muchos.

+0

+1 para 'Learning Objective-C: A Primer'. Recuerdo cuando aprendí Objective-C por primera vez que este documento realmente me ayudó mucho. – v1Axvw

+0

gracias, estoy trabajando en las conferencias de Stanford en este momento, las encuentro más instructivas que los libros que tengo. Estoy en la quinta en este momento, tengo una comprensión bastante buena de los conceptos básicos de Objective-C, es más la aplicación en xCode con la que estoy luchando. Entiendo que la referencia de acción objetivo anterior puede parecer no relacionada, pero básicamente el conferencista describió la acción objetivo y el protocolo/delegado como los dos métodos para que los controladores y las vistas se comuniquen, por lo tanto, por qué lo incluí. – Alan

+0

Hasta cierto punto son similares. El objetivo/acción es algo específico de XCode y Objective C porque básicamente proporciona lo que llamamos metadatos sobre su aplicación. Al compilar, XCode utiliza esta información para conectar cosas, ahorrándole tener que escribir manualmente el código para hacerlo. El patrón del delegado es independiente del lenguaje. Por ejemplo, podría usarlo en una aplicación Java. Por lo tanto, comprender el concepto del patrón de delegado lo ayudará de manera más amplia en tanto que la comprensión de cómo funcionan los objetivos/acciones lo ayudará más específicamente con una aplicación de Objective C. – drekka

0

Para entender a los delegados, eche un vistazo a los delegados proporcionados por Cocoa. Por ejemplo NSWindow tiene un método de delegado llamado - (void) windowWillClose: (NSNotification *) aNotification si implementa ese método delegado, mira la notificación para determinar qué ventana está a punto de cerrarse y realiza alguna limpieza para esa ventana . Usted es un delegado para el objeto NSWindow en el sentido de que está haciendo un trabajo para el objeto ventana.

Todos los métodos de delegado de Cocoa tienen nombres que incluyen palabras como "did", "will", "should", etc. Le dan a su código la capacidad de hacer cosas especiales además de las cosas normales que haría por esos mismos objetos; por lo tanto, eres un delegado para esos objetos.

2

Existen delegados para ayudarlo a evitar la creación de subclases.

La subclasificación es algo que siempre debe intentar evitar, ya que es una forma muy estrecha de acoplamiento. El acoplamiento es cuando dos objetos dependen el uno del otro para funcionar correctamente, y mientras más acoplamiento tenga, más difícil será hacer cambios en su programa (porque cada vez que tenga que cambiar un objeto, se verá obligado a realizar cambios en otro objetos que dependen de ello).

La razón por la que las subclases son una forma de acoplamiento es porque cuando subclases desde una superclase, tu subclase dependerá de los métodos de la superclase (que la subclase hereda). Entonces, si tiene que cambiar la superclase, posiblemente tenga que cambiar todas las subclases con ella.

Supongamos que quiere tener un grupo de objetos que son exactamente iguales, excepto por lo que hacen con un método. Al crear subclases, debería crear un grupo de diferentes subclases y sobrescribir ese único método en todas ellas, lo que implicaría una gran cantidad de subclases (y un acoplamiento no deseado). Aquí es donde entran los delegados. En lugar de crear una subclase un montón de veces, simplemente puede crear una clase y diseñarla para que posea un objeto de identificación de tipo anónimo, que será el objeto delegado (lo llamaremos el niño) Este objeto secundario tendrá el único método único que anteriormente estaba en el elemento principal, pero ahora el padre activará el método en el objeto hijo.

Así que en lugar de subclase un montón de veces, creamos un montón de instancias de la misma clase, y le damos a cada una un objeto delegado diferente, lo cual podemos hacer ya que el tipo ID no especifica qué tipo de objeto tenemos usar. Cada objeto de delegado diferente implementa ese método de manera diferente, y evitamos la creación de subclases.