2009-11-24 11 views
5

Hej, szukam przydatnych zasobów o Delegatach. Rozumiem, że delegat siedzi w tle i otrzymuje wiadomości, gdy pewne rzeczy się zdarzają - np. wybrana zostanie komórka tabeli lub zostaną pobrane dane z połączenia przez sieć.Delegaci, nie mogę się nimi pochwalić

W szczególności chciałbym wiedzieć, jak korzystać z delegatów z wieloma obiektami. O ile mi wiadomo, określenie tego samego delegata dla obiektu (np. Komórki tabeli) spowodowałoby wywołanie tych samych zdarzeń dla obu komórek w tym samym czasie. Czy istnieje coś równoważnego do utworzenia uczestnika dla danego obiektu?

Z góry dzięki!

Odpowiedz

6

w kakao, obiekty niemal zawsze identyfikują się podczas wywoływania metody delegata. Na przykład, UITableView przechodzi się jako pierwszy parametr komunikatu delegata podczas wywoływania go:

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

Jeśli chcesz tego samego pełnomocnika do obsługi wielu UITableViews, a potem po prostu potrzebują trochę uzależnione od obiektu tableView przekazywane do metoda:

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

}

Jeśli nie chcesz porównać wskaźniki obiektów bezpośrednio, zawsze można skorzystać z właściwości tag jednoznacznie określić swoje poglądy.

2

Zwykle, jeśli masz metodę delegowania, która może wymagać odbierania wiadomości z wielu różnych obiektów, po prostu obiekt wywołujący przekazuje się do delegata w wiadomości (wywołanie metody).

Na przykład, jeśli chcesz metodę delegata, aby wyodrębnić tekst z etykietę tableviewcell jest definicja metoda będzie wyglądać następująco:

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

Można by wywołać metodę z tableviewcell wygląda następująco:

[delegate extractTextFromLabelOfTableCell:self]; 

Każda instancja tableviewcell wysłałaby się do delegata, a delegat wyodrębniłby tekst tej instancji. W ten sposób pojedynczy obiekt uczestnika mógł obsłużyć dowolnie dużą liczbę komórek.

1

Delegat jest sposobem dodawania zachowań do klasy bez podklasy lub dołączania kontrolera do klasy.

W podanym przykładzie widoku tabeli delegat rozszerza lub kontroluje tabelę, a nie komórkę. Tabela została zaprojektowana tak, aby mieć kontroler, komórka nie. Ten wybór projektu polega na tym, że nie można określać delegatów właściwych dla komórek.

Jednak metody delegatów zawsze będą ogłaszać obiekt źródłowy (ten, do którego dołączony jest delegat) i odpowiednie parametry (np. Komórka, której dotyczy), aby zawsze móc w pełni obsłużyć tę akcję.

W twoim przypadku, jeśli masz komórkę i chcesz, aby komórka sama się zarządzała, wówczas metoda delegata (która prawdopodobnie zostanie zaimplementowana na twoim UITableViewController) może po prostu pobrać komórkę z tabeli źródłowej przy użyciu jej NSIndexPath (przekazywany jako parametr do metody delegatów) i wywoływania metody na podklasie komórki w celu wykonania jej pracy.

Powiązane problemy