2010-11-18 15 views

Respuesta

80

Delegados envíanos mensajes.

Por ejemplo: si usa el delegado del acelerómetro, recibirá mensajes sobre el acelerómetro.

Si usa ese nuevo delegado de detección de neutrinos, recibirá mensajes sobre cualquier neutrino detectado en el área.

Si usa PopUps, PopUps le enviará mensajes. Y la forma en que se hace, es con el delegado de PopUp. Hay muchos, muchos ejemplos.

Por lo tanto, los delegados envían mensajes.

Es así de simple.

Puede preguntar: "¿A DÓNDE envía estos mensajes?"

La respuesta es esta: envía los mensajes a donde se establece la cosa ".delegate".

Cuando "establece el delegado", lo que hace es decir dónde quiere que vayan los mensajes.

Por lo tanto,

blah.delegate = amazingPlace enviará los mensajes a "amazingPlace".

blah.delegate = somewhereElse enviará los mensajes a "somewhereElse".

blah.delegate = auto enviará los mensajes ...... a que.

Muy a menudo, se desea que los mensajes llegan a "usted", por lo que acaba de decir "sí blah.delegate ="

Es un error muy común, de olvidar esa línea de código.

Si olvida esa línea de código, está lleno. Los mensajes van al en ninguna parte, y se quedan rascándose la cabeza tratando de descubrir qué salió mal.

Algo más que tienes que hacer: cuando utilizas un delegado, tienes que decir que quieres usar el delegado. En los viejos días con Objective-C, que acaba de hacer esto ...

@interface AppDelegate_Pad : NSObject <UIApplicationDelegate> 
@interface BigTop : UIViewController <ASIHTTPRequestDelegate, UIPopoverControllerDelegate> 
@interface Flying : UIViewController <UIAccelerometerDelegate> 

Se puede ver que 'BigTop' quiere usar dos delegados, a saber, la ASIHTTPRequestDelegate y la UIPopoverControllerDelegate. Mientras que 'Flying' solo quiere usar un delegado, quiere usar el acelerómetro.

En Swift, no podría ser más fácil - sólo hay una coma a continuación, los protocolos:

class YourClass:UIViewController, SomeDelegate, AnotherDelegate 

que realmente no puede hacer mucho en el iPhone sin necesidad de utilizar delegados por todo el lugar.

Los delegados se utilizan en todas partes y siempre en iOS.

Es perfectamente normal que una clase use una docena de delegados.

En el ejemplo de "vuelo" arriba, en alguna parte del código para "vuelo" Habría que decir [[UIAccelerometer sharedAccelerometer] setDelegate:self];

En el caso de BigTop, tendría que configurar el delegado en algún lugar de las ASIHttpRequests,

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:gid forKey:@"gid"]; 
[request setPostValue:nom forKey:@"nom"]; 
[request setDelegate:self]; 

(no se olvide de los viejos tiempos con Objective-C, x.delegate=self era exactamente el mismo que [x setDelegate:self].)

Hoy en día con Sw IFT sólo hay que escribir

x.delegate = self 

y eso es todo lo que hay que hacer.

Así que eso es lo que estás haciendo. Los delegados envían mensajes. Tiene que decir donde desea que los mensajes vayan. Muy típicamente, usted quiere que vayan a "usted", entonces en ese caso simplemente diga x.delegate=self.

Espero que ayude.

+5

Dicho sea de paso, NO ES REALMENTE un delegado de detección de neutrinos. Tienes que escribir el tuyo – Fattie

+1

gracias ... estaba realmente confundido por eso. –

+1

mejor explicación que he visto hasta ahora – SeanNieuwoudt

-3

Si en cualquier caso la respuesta de Bourne no ayuda ... un delegado es básicamente la reacción de un evento en un objeto y decir ".delegate = self" significa que esos protocolos se han adoptado en sí mismo ... por ejemplo. lo que sucede cuando se selecciona una fila en la tabla se lo dice el método de delegado de tabla vista "didSelectRowAtIndexPath" ... y si un viewcontroller tiene una tabla vista ... y "didSelectRowAtIndexPath" se define en ese viewcontroller solo diremos ... tableview .delegate = self "... y" self.anything "se usa para decir que" anything "es una propiedad de sí mismo ... por ejemplo NSString * cualquier cosa; @property (no atómico, retener) NSString * anything ;

luego "self.anything"

-1

Delegate se utiliza para pasar/comunicar datos/mensaje b/w dos objetos de clases. Aquí, tableView (Remitente) envía datos/mensaje al viewController (Receptor). Considere el ejemplo de implementar UITableView en la costumbre viewController Aquí, UITableViewDataSource & UITableViewDelegate son en realidad protocolos. Lamentablemente, UIKit Framework no es de código abierto. Pero aseguraré esto lo que sucede internamente después de referirme a muchos artículos.

El protocolo es como entrenador de baloncesto con algunos requisitos. Él/ella le dice a los jugadores como class, struct, enum what to do? usando esos requisitos. Pero él/ella doesn't knowshow to do? por el mismo. Por lo tanto, la clase o estructura que conforma ese protocolo debe proporcionar la implementación de esos requisitos al tiempo que logra tirar la pelota.

protocol UITableViewDelegate { 
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
} 

Se dice que un protocolo es un protocolo DataSource y, a continuación, siempre contiene las funciones necesarias con "tipo de retorno" como se muestra a continuación.

protocol UITableViewDataSource { 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
} 

Ejecución UITableView el interior a medida viewController

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    let tableView = UITableView()  

    override func viewDidLoad { 
     tableView.delegate = self 
     tableView.dataSource = self 
    } 

Aquí, tableView actúa como Delegador (remitente) & viewController object i.e (self) como Delegado (receptor). Para obtener UITableView en viewController, debe cumplir con ambos protocolos.

Por lo tanto, el objeto de clase viewController ha implementado todas las funciones requeridas de ambos protocolos. Ahora, self se puede utilizar como tipo UITableViewDelegate o tipo UITableViewDataSource porque el protocolo se puede utilizar como tipo para un objeto de clase que se ajuste a él. Ahora, ambas propiedades de tableView es decir delegate & dataSource se asignan a self porque tiene los mismos tipos de protocolos respectivos.

Las funciones no opcionales de ambos protocolos se implementan en viewController objeto de clase de la siguiente

Protocolo UITableViewDelegate funciones

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
// Do further processes like pushing or poping another viewController 
} 

Protocolo UITableViewDataSource funciones

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 10 
} 

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") 
} 

1) Cuando el usuario seleccione una fila en una sección luego tableview (Sender) es decir UItableView() llamadas th e UITableViewDelegate func a continuación se muestra al pasar datos a los parámetros tableView & indexPath que reside en el objeto viewController (Receptor) a través de su propiedad delegate. Ahora, viewController utiliza los datos pasados ​​para realizar más procesos, como empujar o abrir el nuevo control de vista personalizado.

tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

2) Funciones dentro UITableViewDatasource protocolo proporciona datos personalizados a tableview (Sender). El tableview pregunta al objeto viewController llamando a las funciones de Datasource con datos de paso a los parámetros tableView & indexPath que se encuentra en el objeto viewController (Receptor) a través de su propiedad datasource. Ahora viewController utiliza los datos pasados ​​& devuelve datos personalizados tableview. Ahora tableview utiliza esos datos para crear células "10" en una especie de "célula" sección & en indexpath

tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10" 

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell" 

Por último, toda UIKit Framework utiliza delegar & patrones de diseño de la fuente de datos en todas sus clases, tales como UIApplication, UITableView, UICollectionView , UITextField & para comunicar datos. Lamentablemente, UIKit Framework no es de código abierto.

+0

Hola, soy un novato en stackOverflow. Mirando a mi alrededor para responder a alguna Q conocida con mi conocimiento! –

+0

La respuesta es correcta. ¡No lo votes! Solo porque ya fue respondido hace 8 años. –

+1

La votación a la baja es más que solo si la respuesta es incorrecta. Si pasa el cursor sobre el botón de votación hacia abajo, verá una información sobre herramientas. Sugiero responder preguntas que son más recientes y que ya no tienen respuestas. Puede usar etiquetas favoritas y filtrará la lista de preguntas para que sea más relevante para usted. De esa forma puedes encontrar preguntas más nuevas para responder. – Fogmeister

Cuestiones relacionadas