Che cos'è la delega e perché è importante nella programmazione iOS?


11

Al momento mi sto insegnando la programmazione iOS e un concetto che trovo davvero difficile da avvolgere è la delega. Che cos'è? Perché e come viene utilizzato? Qual è il vantaggio? La scrittura tecnica del libro che sto leggendo rende difficile da capire.


4
È possibile trovare utile l' intersezione tag c + delegati obiettivo su overflow dello stack utile.

Risposte:


16

Per capire delegates, devi capire protocols.

A protocolè come un contratto di assistenza. Quando un oggetto (il più delle volte una UIViewControllersottoclasse, ma non sempre) firma quel contratto, sta dicendo "Sono interessato a fornire la logica per sostenere il messaggio che mi hai inviato". Questo è simile per NSNotificationCenterquanto riguarda la registrazione per un livello di interesse, la differenza è che un oggetto che impiega la delega può averne solo uno delegatealla volta, dove più oggetti possono registrarsi per lo stesso NSNotification.

Apple utilizza la delega pervasiva. Sempre più spesso, però, stai vedendo che Apple sposta molte delle sue API verso blocks, che sono simili callbacksin altre lingue.

Detto questo, la delega aiuta a mantenere MVC, anche se direi che la delega è un modello di progettazione in sé e per sé. Aiuta a separare i modelli dai controller. Come nell'esempio di John Cartwright, UITableViewsa come visualizzare righe e sezioni. Sa riutilizzare UITableViewCellsper motivi di prestazioni. Conosce tutte le altre cose che UIScrollViewconosce. Ma non sa quali celle visualizzare. Non sa con cosa popolare quelle cellule. Non sa quali celle riutilizzare per un dato NSIndexPath. Questo dovrebbe davvero essere il compito del controller, comunque. La delega consente alla vista tabella di scaricare questa logica di non vista su un oggetto che dovrebbe comunque avere tale responsabilità.

Inoltre, non sei bloccato in un delegato per l'intera vita di un oggetto. Si potrebbe facilmente avere più origini dati per un dato UITableViewe cambiarle in fase di esecuzione, se necessario.

Quindi, da un lato, la delega è ottima per fornire dati e rispondere alle interazioni da un oggetto. Vedrete che in un sacco di classi UIKit, come un UITableView, UIPickerView, UICollectionView, etc.

Ma la delega è anche molto utile quando si desidera passare informazioni tra oggetti. Puoi creare facilmente i tuoi protocolli e iscriverti ai tuoi oggetti per seguirli. Inoltre, i metodi di protocollo sono @requiredpredefiniti, ma è possibile specificare alcuni metodi@optional. Questo può darti una buona flessibilità se ne hai bisogno. Supponiamo che tu abbia un controller di visualizzazione padre e un controller di visualizzazione figlio. Forse stai usando la nuova API di contenimento per farlo. In genere, se è necessario passare informazioni dal genitore al figlio, lo si fa con una proprietà. Fatto. Ma cosa succede se è necessario trasferire le informazioni dal bambino al genitore? Forse qualcosa cambia nel bambino e devi avvisare il genitore. Certo, potresti fare un po 'di KVO su determinati valori. Ma forse vuoi sapere quando viene premuto un pulsante. È sufficiente creare un nuovo protocollo nel controller di visualizzazione figlio

@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end

@interface MyChildViewController : UIViewController

@property (weak, nonatomic) id <MyChildDelegate> delegate;

@end

In MyChildViewController, quando si tocca il pulsante, è sufficiente verificare se il delegato risponde al messaggio del delegato (se è necessario e il delegato non implementa il metodo, si bloccherà. È possibile effettuare il metodo @optionalse necessario) e inviare esso:

- (IBAction)someButtonTapped:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
        [self.delegate buttonWasTappedInChild:self];
    }
}

Quindi imposta il delegato di MyChildViewController su selfe implementalo - (void)buttonWasTappedInChild:(MyChildViewController *)childViewControllernel controller della vista padre. BOOM! Hai informazioni passate da un bambino fino al genitore. La relazione tra i due oggetti non ha nemmeno bisogno di essere stretta come genitore / figlio. È un contratto di servizio, quindi fino a quando l'oggetto che si iscrive mantiene la sua parte dell'accordo implementando i metodi richiesti, sei d'oro!

NOTA: i delegati devono essere deboli / assegnare proprietà, altrimenti si entra in un ciclo di mantenimento in cui nessuno degli oggetti può essere deallocato.

Spero che questo ti aiuti!


2

I delegati sono oggetti che implementano determinate funzioni quando non ha senso implementare tali funzioni sull'oggetto normale. È una forma di iniezione di dipendenza.

Per un esempio concreto, guarda il protocollo UITableViewDelegate. Questi metodi non hanno senso per l'implementazione diretta di una vista tabella, poiché le azioni per la selezione di una riga della vista tabella saranno diverse in ciascuna app e forse in ciascuna vista tabella. Il delegato ha un metodo in -tableView:didSelectRowAtIndexPath:modo da poter creare un oggetto che gestisce la selezione delle righe senza sottoclassare la vista tabella per ogni azione separata che si desidera implementare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.