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.