what tutorial protocol example delegate are and cocoa delegates protocols delegation convention

cocoa - tutorial - ¿Qué se entiende por.delegate=self?



swift 4 delegate tutorial (3)

¿Alguien podría explicar el significado de someViewController.delegate = self y self.delegate ? ¿Dónde nos ayudan?


Los delegados te envían 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.

Entonces, 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 = self enviará los mensajes ... a ti .

Muy a menudo, quieres que los mensajes lleguen a "ti", entonces solo dices "blah.delegate = self"

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

Si olvida esa línea de código, está lleno. Los mensajes no van a ninguna parte , y te quedas rascándote la cabeza tratando de descubrir qué salió mal.

Algo más que tiene que hacer: cuando usa un delegado, debe decir que desea usar el delegado. En los viejos tiempos con objetivo-c, solo haces esto ...

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

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

En Swift , no podría ser más fácil, solo tienes una coma y luego los protocolos:

class YourClass:UIViewController, SomeDelegate, AnotherDelegate

Realmente no se puede hacer mucho en el iPhone sin usar delegados por todos lados.

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

Es perfectamente normal que una clase pueda usar una docena de delegados.

En el ejemplo de "Volar" anterior, en algún lugar del código para "Volar" debería decir [[UIAccelerometer sharedAccelerometer] setDelegate:self];

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

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

(No olvide que en los viejos tiempos con objetivo-c, x.delegate=self era exactamente lo mismo que [x setDelegate:self] ).

Hoy en día con Swift simplemente escribes

x.delegate = self

y eso es todo lo que hay que hacer.

Entonces eso es lo que estás haciendo. Los delegados envían mensajes . Tienes que decir dónde quieres que vayan los mensajes. Muy típicamente, quieres que vayan a "ti", entonces en ese caso simplemente dices x.delegate=self .

Espero eso ayude.


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

entonces "self.anything"


Delegate se usa para pasar / comunicar datos / mensaje b / w dos objetos de clases. Aquí, tableView (Sender) envía datos / mensajes a viewController (Receiver). Considere un ejemplo de implementación de UITableView en UITableView personalizado Aquí, UITableViewDataSource y UITableViewDelegate son en realidad protocolos. Lamentablemente, UIKit Framework no es de código abierto. Pero aseguraré esto lo que ocurre 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? al usar esos requisitos. Pero él / ella doesn''t knows how to do? por ellos mismos. 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 que siempre contiene las funciones requeridas con el "tipo de devolución", como se muestra a continuación.

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

Implementación de UITableView dentro de viewController personalizado

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource { let tableView = UITableView() override func viewDidLoad { tableView.delegate = self tableView.dataSource = self }

Aquí, tableView actúa como delegador (remitente) y viewController object ie (self) como delegado (receptor).

Para obtener UITableView en viewController debe ajustarse a ambos Protocolos.

Entonces, 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 ie delegate y dataSource se asignan a self porque tienen los mismos tipos de protocolos respectivos.

Las funciones no opcionales de ambos Protocolos se implementan en el objeto de clase viewController como se muestra a continuación

UITableViewDelegate protocolo UITableViewDelegate

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

UITableViewDataSource protocolo UITableViewDataSource

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 selecciona una fila en una sección, entonces tableview (Sender) es decir, UItableView() llama al UITableViewDelegate muestra al pasar los datos a los parámetros tableView & indexPath que reside en viewController object (Receiver) a través de su propiedad de delegate . Ahora viewController usa esos datos pasados ​​para hacer otros procesos, como empujar o mostrar a un nuevo control de vista personalizado.

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

2) Las funciones dentro del protocolo UITableViewDatasource proporcionan datos personalizados a la tableview de tableview (remitente). La vista de tableview pregunta al objeto viewController llamando a las funciones de viewController con el paso de datos a los parámetros tableView & indexPath que reside en viewController object (Receiver) a través de su propiedad datasource . Ahora viewController utiliza los datos pasados ​​y devuelve una tableview datos personalizada. Ahora tableview usa esos datos para crear "10" celdas en una sección y tipo de "celda" en indexpath

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

Finalmente, el UIKit Framework completo utiliza patrones de diseño de delegado y UIKit Framework datos en todas sus clases, tales como UIApplication , UITableView , UICollectionView , UITextField , etc. para comunicar datos. Lamentablemente, UIKit Framework no es de código abierto.