Domanda

Qualcuno potrebbe spiegare il significato di someViewController.delegate = self e self.delegate? Dove ci aiutano?

È stato utile?

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"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top