Cosa si intende per .delegate = auto?
-
25-09-2019 - |
Domanda
Qualcuno potrebbe spiegare il significato di someViewController.delegate = self
e self.delegate
? Dove ci aiutano?
Soluzione
I delegati messaggi Invia a voi.
Ad esempio:. Se si utilizza il delegato accelerometro, si otterrà i messaggi circa l'accelerometro
Se si utilizza tale nuovo delegato neutrino-rilevazione, si otterrà i messaggi su eventuali neutrini rilevati nella zona.
Se si utilizza PopUps, PopUps si inviano messaggi. E il modo in cui è fatto, è con il delegato del PopUp. Ci sono molti, molti esempi.
Quindi, i delegati inviare messaggi.
E 'così semplice.
Si potrebbe chiedere: "dove va a inviare questi messaggi?"
La risposta è questa: invia i messaggi a cui si imposta la ".delegate" thingy
.Quando si "imposta il delegato," quello che state facendo è dire dove si desidera che i messaggi di andare.
Quindi,
blah.delegate = amazingPlace invierà i messaggi per "amazingPlace".
blah.delegate = somewhereElse invierà i messaggi per "somewhereElse".
blah.delegate = auto invierà i messaggi ...... vi .
Molto spesso, si desidera che i messaggi vengano a "tu", quindi basta dire "blah.delegate = sé"
Si tratta di un errore molto comune, a dimenticare che la linea di codice.
Se si dimentica quella linea di codice è farcito. I messaggi vanno da nessuna parte , e si sono lasciati grattarsi la testa cercando di capire cosa è andato storto.
Un'altra cosa che devi fare:. Quando si utilizza un delegato, si deve annunciare in anticipo, che, si desidera utilizzare il delegato
Come fare?
Ai vecchi tempi con Objective-C, che hai appena fatto questo ...
@interface AppDelegate_Pad : NSObject <UIApplicationDelegate>
@interface BigTop : UIViewController <ASIHTTPRequestDelegate,
UIPopoverControllerDelegate>
@interface Flying : UIViewController <UIAccelerometerDelegate>
Si può vedere che 'BigTop' vuole usare due delegati, vale a dire l'ASIHTTPRequestDelegate e UIPopoverControllerDelegate. Mentre 'volante' vuole usare solo un delegato -. Si vuole usare l'accelerometro
In Swift , non potrebbe essere più semplice - basta una virgola quindi i protocolli:
class YourClass:UIViewController, SomeDelegate, AnotherDelegate
non si può davvero fare molto su iPhone senza l'utilizzo di delegati da tutte le parti.
I delegati sono utilizzati in tutto il mondo e per tutto il tempo in iOS.
E 'perfettamente normale che una classe potrebbe utilizzare una dozzina di delegati.
Nell'esempio di "Volare" di cui sopra, da qualche parte nel codice per "Flying" avrebbe dovuto dire ...
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
Nel caso di BigTop, avrebbe dovuto impostare il posto delegato per le ASIHttpRequests,
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:gid forKey:@"gid"];
[request setPostValue:nom forKey:@"nom"];
[request setDelegate:self];
(non dimenticare ai vecchi tempi con Objective-C, x.delegate=self
era esattamente lo stesso di [x setDelegate:self]
.)
Al giorno d'oggi, con Swift è sufficiente digitare
x.delegate = self
e questo è tutto ciò che devi fare.
Ecco, questo è quello che stai facendo. Delegati messaggi Invia . Devi dire dove si desidera che i messaggi di andare. Molto genere, si desidera loro di andare a "voi", così in questo caso si dice semplicemente x.delegate=self
.
La speranza aiuta.
Altri suggerimenti
Delegate
viene utilizzato per passare / comunicare i dati / messaggio di b / w due oggetti di classi. Qui, tableView
(mittente) invia dati / messaggio a viewController
(ricevitore).
Consideriamo esempio di implementazione UITableView
in viewController
personalizzato
Qui, UITableViewDataSource
& UITableViewDelegate
sono in realtà i protocolli. Purtroppo, UIKit Framework
non è open source. Ma io vi assicuro questo ciò che accade internamente dopo aver fatto riferimento molti articoli.
Protocollo è come allenatore di basket con alcuni requisiti in esso. Lui / Lei dice giocatori come classe, struct, enum what to do?
utilizzando tali requisiti. Ma lui / lei doesn't knows
how to do?
by themself. Quindi, la classe o struct che si conforma che il protocollo dovrebbe fornire l'implementazione di tali requisiti mentre il raggiungimento di dunk la palla.
protocol UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}
Un protocollo è detto protocollo DataSource allora contiene sempre funzioni richieste con "tipo di ritorno", come illustrato di seguito.
protocol UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
}
Implementazione UITableView all'interno personalizzato viewController
class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let tableView = UITableView()
override func viewDidLoad {
tableView.delegate = self
tableView.dataSource = self
}
Qui, tableView
agisce come Delegator (mittente) e viewController object i.e (self)
come Delegato (ricevitore).
Al fine di ottenere UITableView
in viewController
.It dovrebbe conformarsi ad entrambi i protocolli.
Quindi, oggetto classe viewController
ha implementato tutte le funzioni richieste di entrambi i protocolli. Ora self
può essere utilizzato sia come tipo UITableViewDelegate
o il tipo UITableViewDataSource
perché protocollo può essere utilizzato come tipo per un oggetto della classe che si conforma ad esso.
Ora, entrambe le proprietà di tableView
cioè delegate
& dataSource
sono assegnati a self
perché il suo dover stessi tipi rispettivo protocollo.
Le funzioni non opzionali su entrambi i protocolli sono implementati in oggetto classe viewController
come sotto
funzioni UITableViewDelegate
protocollo
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Do further processes like pushing or poping another viewController
}
funzioni UITableViewDataSource
protocollo
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) Quando l'utente seleziona una riga in una sezione poi tableview
(mittente) cioè UItableView()
chiama func UITableViewDelegate
sotto mostrato passando dati ai parametri tableView
& indexPath
che risiede nella struttura viewController
(ricevitore) tramite la proprietà delegate
. Ora viewController
utilizza tali dati passati di fare ulteriori processi come spinta o poping di costume nuovo viewController.
tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
2) funzioni all'interno protocollo UITableViewDatasource
fornisce dati personalizzati a tableview
(mittente). Il tableview
chiede all'oggetto viewController
chiamando funzioni origine dati con passaggio di dati di parametri tableView
& indexPath
che risiede in oggetto viewController
(ricevitore) tramite la proprietà datasource
. Ora viewController
utilizza tali dati e rendimenti passati indietro i dati personalizzati tableview
. Ora tableview
utilizza tali dati per creare "10" cellule in una sezione & sorta di "cella" a indexpath
tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"
tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"
Infine, usi interi UIKit Framework
delegano & datasource modelli di progettazione in tutte le sue classi come UIApplication
, UITableView
, UICollectionView
, UITextField
e così via per comunicare i dati. Purtroppo, UIKit Framework
non è open source.
Se in ogni caso la risposta di Bourne non aiuta .. un delegato è fondamentalmente la reazione di un evento su un oggetto e dicendo significa ".delegate = auto" questi protocolli sono stati adottati in auto ... per esempio .. ciò che accade quando una riga è selezionata a Tableview è raccontata dal metodo delegato di Tableview "didSelectRowAtIndexPath" ... e se un viewcontroller ha una Tableview .. e "didSelectRowAtIndexPath" è definito in che viewcontroller solo allora diremo ... tableview.delegate = auto" ... e "self.anything" è usato per dire che "tutto" è una proprietà di auto .. per es. NSString * nulla; @property (nonatomic, mantenere) NSString * nulla;
poi "self.anything"