Niestety ta metoda nie jest wywoływana, chyba że zostanie naciśnięty typ przycisku wewnętrznego dostarczony podczas korzystania z jednego z predefiniowanych typów. Aby użyć własnego, musisz utworzyć swoje akcesorium jako przycisk lub inną podklasę UIControl (polecam przycisk używający -buttonWithType:UIButtonTypeCustom
i ustawiający obraz przycisku, zamiast używania UIImageView).
Oto kilka rzeczy, których używam w Outpost, który dostosowuje wystarczającą liczbę standardowych widżetów (tylko nieznacznie, aby pasowały do naszego zielonkawego zabarwienia), które ostatecznie wykonałem własną podklasę pośredniczącą UITableViewController, aby przechowywać kod narzędziowy dla wszystkich innych widoków tabel do użycia (teraz podklasy OPTableViewController).
Po pierwsze, ta funkcja zwraca nowy przycisk ujawniania szczegółów za pomocą naszej niestandardowej grafiki:
- (UIButton *) makeDetailDisclosureButton
{
UIButton * button = [UIButton outpostDetailDisclosureButton];
[button addTarget: self
action: @selector(accessoryButtonTapped:withEvent:)
forControlEvents: UIControlEventTouchUpInside];
return ( button );
}
Po zakończeniu przycisk wywoła tę procedurę, która następnie przekazuje standardową procedurę UITableViewDelegate dla przycisków akcesoriów:
- (void) accessoryButtonTapped: (UIControl *) button withEvent: (UIEvent *) event
{
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: self.tableView]];
if ( indexPath == nil )
return;
[self.tableView.delegate tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath];
}
Ta funkcja lokalizuje wiersz, pobierając lokalizację dotyku w widoku tabeli ze zdarzenia dostarczonego przez przycisk i pytając widok tabeli o ścieżkę indeksu wiersza w tym punkcie.
self.tableView
. co jeśli nie wiesz, który widok tabeli zawiera wiersz?Uważam, że ta strona internetowa jest bardzo pomocna: niestandardowy widok akcesoriów dla twojego uitableview na iPhonie
Krótko mówiąc, użyj tego w
cellForRowAtIndexPath:
:następnie zaimplementuj tę metodę:
źródło
Moje podejście polega na utworzeniu
UITableViewCell
podklasy i hermetyzacji logiki, która wywoła w niej zwykłąUITableViewDelegate
metodę.źródło
button.superview
,cell.superview
i[tableView.delegate tableView:...]
nie są wystarczająco bezpieczne.Rozszerzenie do powyższej odpowiedzi Jima Doveya:
Zachowaj ostrożność, używając UISearchBarController z UITableView. W takim przypadku chcesz sprawdzić
self.searchDisplayController.active
i użyćself.searchDisplayController.searchResultsTableView
zamiastself.tableView
. W przeciwnym razie uzyskasz nieoczekiwane wyniki, gdy searchDisplayController jest aktywny, zwłaszcza gdy wyniki wyszukiwania są przewijane.Na przykład:
źródło
Zdefiniuj makro dla tagów przycisków:
Utwórz przycisk i ustaw cell.accessoryView podczas tworzenia komórki
Ustaw cell.accessoryView.tag przez indexPath w metodzie UITableViewDataSource -tableView: cellForRowAtIndexPath:
Program obsługi zdarzeń dla przycisków
Zaimplementuj metodę UITableViewDelegate
źródło
tag
chyba że jest to absolutnie konieczne, poszukaj innego rozwiązania.Po dotknięciu przycisku można wywołać następującą metodę w podklasie UITableViewCell
źródło
Z podejściem yanchenko musiałem dodać:
[accBtn setFrame:CGRectMake(0, 0, 20, 20)];
Jeśli używasz pliku xib do dostosowywania tableCell, to initWithStyle: reuseIdentifier: nie zostanie wywołany.
Zamiast tego zastąp:
źródło
Musisz użyć a,
UIControl
aby poprawnie uzyskać wysyłkę zdarzenia (na przykład aUIButton
) zamiast prostegoUIView/UIImageView
.źródło
Szybki 5
W tym podejściu
UIButton.tag
do przechowywania indexPath przy użyciu podstawowego przesuwania bitów. To podejście będzie działać w systemach 32 i 64-bitowych, o ile nie masz więcej niż 65535 sekcji lub wierszy.źródło
Począwszy od iOS 3.2, możesz uniknąć przycisków, które inni tutaj zalecają, i zamiast tego użyj UIImageView z rozpoznawaniem gestów dotknięcia. Pamiętaj, aby włączyć interakcję z użytkownikiem, która jest domyślnie wyłączona w UIImageViews.
źródło