2009-11-24 14 views
5

Ehi, sto cercando risorse utili sui delegati. Capisco che il delegato sieda in background e riceva messaggi quando accadono certe cose - ad es. viene selezionata una cella di tabella o vengono recuperati i dati da una connessione sul Web.I delegati, non riesco a capirci qualcosa

Quello che mi piacerebbe sapere in particolare è come utilizzare i delegati con più oggetti. Per quanto ne so, la specifica dello stesso delegato per un oggetto (ad esempio una cella di tabella) causerebbe la stessa chiamata agli stessi eventi per entrambe le celle nello stesso momento. C'è qualcosa di equivalente all'istanziazione di un delegato per un particolare oggetto?

Grazie in anticipo!

risposta

6

in Cocoa, oggetti quasi sempre identificarsi quando si chiama un metodo delegato. Ad esempio, UITableView si passa come il primo parametro del messaggio delegato al momento della chiamata è:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

Se si voleva lo stesso delegato di gestire più UITableViews, allora avete solo bisogno di un po 'condizionato l'oggetto tableView passato al metodo:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableView == self.myFirstTableView) { 
     // do stuff 
    } else if (tableView == self.mySecondtableView) { 
     // do other stuff 
    } 
} 

}

Se non si desidera confrontare direttamente i puntatori di oggetto, si può sempre utilizzare la proprietà tag per identificare in modo univoco le vostre opinioni.

2

In genere, se si dispone di un metodo delegato che potrebbe dover ricevere messaggi da molti oggetti diversi, è sufficiente che l'oggetto chiamante passi automaticamente al delegato nel messaggio (chiamata metodo).

Ad esempio, se si voleva un metodo delegato per estrarre il testo da l'etichetta di un tableviewcell, la definizione di un metodo sarebbe simile:

-(void) extractTextFromLabelOfTableCell:(UITableViewCell *) theCallingCell{ 
... 
NSString *extractedText=theCallingCell.textLabel.text; 
} 

Si potrebbe chiamare il metodo da un tableviewcell questa convenzione:

[delegate extractTextFromLabelOfTableCell:self]; 

Ogni istanza del tableviewcell si inviava al delegato e il delegato estraeva il testo di quell'istanza. In questo modo, un singolo oggetto delegato può gestire un numero arbitrariamente elevato di celle.

1

Un delegato è un modo di aggiungere comportamenti a una classe senza sottoclasse o per collegare un controller a una classe.

Nell'esempio della vista tabella, il delegato sta estendendo o controllando la tabella, non la cella. La tabella è progettata per avere un controller, la cella no. Questa scelta di progettazione è il motivo per cui non è possibile specificare i delegati specifici della cella.

Tuttavia, i metodi delegati annunceranno sempre l'oggetto di origine (quello a cui è collegato il delegato) e i parametri rilevanti (come la cella interessata) in modo da essere sempre in grado di gestire pienamente l'azione.

Nel tuo caso, se si dispone di una cella e si desidera che il cellulare di gestire se stesso, allora il metodo delegato (che sarà probabilmente implementata sul UITableViewController) può semplicemente prendere il cellulare dalla tabella di origine utilizzando il suo NSIndexPath (passato come parametro al metodo delegate) e invocare un metodo sulla sottoclasse della cella per fare il suo lavoro.

Problemi correlati