Lo que se entiende por.delegate = self?


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

Author: Markandayan P, 2010-11-18

3 answers

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 utiliza ventanas emergentes, las ventanas emergentes le envían mensajes. Y la forma en que se hace, es con el delegado de la ventana emergente. Hay muchos, muchos ejemplos.

Entonces, los delegados envían mensajes.

Es que simple.

Usted podría preguntar, " ¿DÓNDE envía estos mensajes?"

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

Cuando "establece el delegado", lo que está haciendo es decir a dónde quiere que vayan los mensajes.

Por lo tanto,

, Bla.delegate = amazingPlace enviará los mensajes a "amazingPlace".

, Bla.delegate = somewhereElse enviará los mensajes a "somewhereElse".

, Bla.delegate = self enviará los mensajes ...... a ti.

Muy a menudo, quieres que los mensajes lleguen a "ti", así que solo dices "bla.delegate = self "

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

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

Algo más tienes que hacer: cuando usas un delegado, tienes que decir que quieres usar el delegado. En los viejos tiempos con objective-c, simplemente haces esto...

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

Puede ver que 'BigTop' quiere usar dos delegados, a saber, el ASIHTTPRequestDelegate y el 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 entonces los protocolos:

 class YourClass:UIViewController, SomeDelegate, AnotherDelegate

Usted realmente no se puede hacer mucho en el iPhone sin usar delegados en todo el lugar.

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" de arriba, en algún lugar del código para "Volar" tendría que decir [[UIAccelerometer sharedAccelerometer] setDelegate:self];

En el caso de BigTop, tendría que establecer 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 olvides en los viejos tiempos con objective-c, x.delegate=self era exactamente lo mismo que [x setDelegate:self].)

Hoy en día con Swift simplemente escribe

  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 . Tienes que decir donde quieres que vayan los mensajes. Muy típicamente, quieres que vayan a "tú", así que en ese caso simplemente dices x.delegate=self.

Espero que ayude.

 84
Author: Fattie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 09:47:27

Delegate se utiliza para pasar / comunicar datos / mensajes b / n dos objetos de clases. Aquí, tableView (Remitente) envía datos/mensajes a viewController (Receptor). Considere un ejemplo de implementación UITableView en custom viewController Aquí, UITableViewDataSource & UITableViewDelegate en realidad son protocolos. Desafortunadamente, UIKit Framework no es de código abierto. Pero voy a asegurar esto lo que internamente sucede después de referir muchos artículos.

Protocolo es como entrenador de baloncesto con algunos requisitos en él. Le dice a jugadores como class, struct, enum what to do? por usando 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 implementación a esos requisitos mientras logra remojar la bola.

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

Se dice que un protocolo es DataSource protocol, entonces siempre contiene las funciones requeridas con "return type" como se muestra a continuación.

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

Implementando UITableView dentro de custom 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 ajustarse a ambos Protocolos.

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

El las funciones no opcionales de ambos protocolos se implementan en el objeto de clase viewController como se muestra a continuación

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 selecciona una fila en una sección, tableview (Remitente), es decir, UItableView() llama al UITableViewDelegate func que se muestra a continuación pasando datos a parámetros tableView & indexPath que reside en viewController objeto(Receptor) a través de su propiedad delegate. Ahora viewController usa esos datos pasados para hacer procesos adicionales como empujar o poping a nuevo controlador de vista personalizado.

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

2) Funciones dentro del protocolo UITableViewDatasource proporciona datos personalizados a tableview (Remitente). El tableview pregunta al objeto viewController llamando a funciones de Datasource pasando datos a parámetros tableView & indexPath que reside en viewController objeto(Receptor) a través de su propiedad datasource. Ahora viewController usa esos datos pasados y devuelve datos personalizados tableview. Ahora tableview usa esos datos para crear celdas" 10 "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, whole UIKit Framework utiliza patrones de diseño de delegado y fuente de datos en todas sus clases, como UIApplication, UITableView, UICollectionView, UITextField & así sucesivamente para comunicar datos. Desafortunadamente, UIKit Framework no es de código abierto.

 -1
Author: Chethan M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-02 23:27:14

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 diciendo".delegate = self " significa que esos protocolos han sido adoptados en self ... por ejemplo.. lo que sucede cuando se selecciona una fila en tableview es dicho por el método delegado de tableview "didSelectRowAtIndexPath"... y si un viewcontroller tiene una vista de tabla .. y "didSelectRowAtIndexPath" se define en ese viewcontroller solo entonces diremos ... tableview.delegate = self"... y "auto.cualquier cosa "se usa para decir que" cualquier cosa " es una propiedad de uno mismo.. por ejemplo. NSString * cualquier cosa; @property (nonatomic, retain) NSString * anything;

Entonces " yo.cualquier cosa "

 -3
Author: Iphone_bharat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-18 07:25:21