2012-09-06 26 views
26

Tworzę przycisk ujawnienia szczegółów, który jest zapełniany za pomocą tablicy ... Jednak funkcja accessoryButtonTappedForRowWithIndexPath: funkcja nie jest wywoływana w mojej klasie. jest delegatem tableviewdelegate i tableviewdatasource.accessoryButtonTappedForRowWithIndexPath: nie jest wywoływana.

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@"reaching accessoryButtonTappedForRowWithIndexPath:"); 
    [self performSegueWithIdentifier:@"modaltodetails" sender:[self.eventsTable cellForRowAtIndexPath:indexPath]]; 
} 

NSLog isnt drukowanie do konsoli, która prowadzi mnie do przypuszczenia, isnt funkcja miano ... Jest to oczywiście po zaznaczeniu na komórkę. Poniższy zrzut ekranu pokazuje, jak mam konfigurację komórki.

enter image description here

+0

Czy na pewno podłączone źródło danych i przekazać odpowiedniej klasy? Czy '- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath' metoda wywołania? – Thermometer

+0

yes (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) wywoływana jest metoda indexPath. – jimbob

Odpowiedz

7

Czy wystarczy kliknąć na komórce, aby go wybrać lub czy rzeczywiście kliknij na dodatkowym wskaźnikiem przycisku na komórce? Z twojego pytania nie wynika jednoznacznie.

accessoryButtonTappedForRowWithIndexPath ma zastosowanie po kliknięciu ikony przycisku w komórce, a nie po wybraniu komórki.

+0

kliknąłeś przycisk – jimbob

+0

czy wykonałeś wszystkie potrzebne połączenia .. źródło danych tableview i przekazałeś je właścicielowi pliku? – Coder

+0

udało ci się dowiedzieć, jaki był problem? – Coder

54

Dokument mówi, że metoda tableView:accessoryButtonTappedForRowWithIndexPath: nie jest wywoływana, gdy ustawiony jest widok akcesoriów dla wiersza pod numerem indexPath. Metoda jest wywoływana tylko wtedy, gdy właściwość accessoryView jest zerowa i gdy używa się i ustawia właściwość accessoryType, aby wyświetlić wbudowany widok akcesoriów. Jak rozumiem, accessoryView i accessoryType wzajemnie się wykluczają. Podczas korzystania z accessoryType, system zadzwoni pod numer tableView:accessoryButtonTappedForRowWithIndexPath: zgodnie z oczekiwaniami, ale sam musisz obsłużyć drugi przypadek.

Sposób w jaki robi to Apple, jest wyświetlany w przykładowym projekcie SDK Accessory. W metodzie delegata źródła danych, ustawiającego obiekt docelowy/akcję na niestandardowy przycisk akcesorium. Ponieważ nie można przejść indexPath do działania, one wywołać metodę pomocniczą, aby pobrać odpowiedni indexPath i przekazać wynik do metody Delegat:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    ... 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    ... 

    // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    ... 
    cell.accessoryView = button; 

    return cell; 
} 


- (void)checkButtonTapped:(id)sender event:(id)event{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil){ 
     [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 

Z jakiegoś powodu, twoja konfiguracja wydaje się spadać w Walizka akcesoriów. Czy próbowałeś ustawić akcesorium z kodem zamiast korzystać z Konstruktora interfejsu?

+0

Wpadłem na ten sam problem i zastanawiam się, czy istnieje błąd w Xcode 4.5 IB, który ustawia 'AccessoryView' zamiast' AccesoryType' po wybraniu Akcesorium w okienku Inspektora TableViewCell.Jeśli utworzysz segue, klikając i przeciągając ze wskaźnika ujawnienia, który również nie działa! – drew

+4

Szybka aktualizacja - wydaje się, że jeśli ustawisz typ akcesorium na 'DetailDisclosure' zamiast tylko zwykłego' Disclosure', zostanie wywołana metoda 'accessoryButtonTappedForRowWithIndexPath' i uruchomiona segue. Nie wiem, dlaczego tak jest, ale przynajmniej możesz zrobić kilka postępów (nawet jeśli twój interfejs nie wygląda tak, jak tego chcesz). – drew

+1

Czy jest to błąd w Xcode, czy też zamierzone zachowanie? Dokumenty Apple są niepokojąco niejasne. Istnieją dwa typy wskaźników ujawnienia w komórce tabeli, zwykłe ujawnianie i ujawnianie szczegółów, ale doktorzy po prostu mówią "przycisk ujawnienia". – SteveCaine

2

drew jest na miejscu.

Jeśli zmienisz na "DetailDisclosure" w Storyboard, to metoda zostanie uruchomiona. (Xcode 4.6 DP3)

36

To wydaje się bardzo istotne ...

wskaźnik Ujawnienie: Kiedy ten element jest obecny, użytkownicy wiedzą, że mogą dotknąć w dowolnym miejscu w wierszu, aby zobaczyć następny poziom w hierarchii albo wybory związane z pozycją na liście. Użyj wskaźnika ujawnienia z rzędu, gdy wybór wiersza powoduje wyświetlenie innej listy. Nie używaj wskaźnika ujawnienia, aby ujawnić szczegółowe informacje na temat pozycji na liście; zamiast tego użyj do tego przycisku ujawniania szczegółów.

Przycisk szczegółowego ujawnienia: Użytkownicy dotykają tego elementu, aby wyświetlić szczegółowe informacje o pozycji na liście. (Zauważ, że możesz użyć tego elementu w widokach innych niż widoki tabel, aby ujawnić dodatkowe szczegóły o czymś, zobacz "Szczegółowe przyciski ujawnienia", aby uzyskać więcej informacji.) W widoku tabeli użyj przycisku szczegółowego ujawnienia w rzędzie, aby wyświetlić szczegóły dotyczące element listy. Zauważ, że przycisk szczegółowego ujawnienia, w przeciwieństwie do wskaźnika ujawnienia, może wykonać działanie niezależne od wyboru wiersza.Na przykład w Ulubionych telefonu dotknięcie tego wiersza inicjuje połączenie z kontaktem; naciśnięcie przycisku ujawnienia szczegółów w wierszu ujawnia więcej informacji o kontakcie.

+1

Link, aby uzyskać więcej informacji: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/Controls.html –

+0

znalazłem ten problem i to rozwiązanie sprawdziło się u mnie – sapatos

8

Według dokumentacji UITableViewCellAccessoryType za to jest oczekiwane zachowanie:

typedef enum : NSInteger {  
UITableViewCellAccessoryNone, 
UITableViewCellAccessoryDisclosureIndicator, 
UITableViewCellAccessoryDetailDisclosureButton, 
UITableViewCellAccessoryCheckmark, 
UITableViewCellAccessoryDetailButton } UITableViewCellAccessoryType; 

Stałe UITableViewCellAccessoryNone Komórka nie ma żadnego widoku akcesorium. Jest to wartość domyślna.

UITableViewCellAccessoryDisclosureIndicator Komórka ma element sterujący o kształcie w kształcie chevronu. Ta kontrolka wskazuje, że dotknięcie komórki wyzwala naciśnięcie. Kontrolka nie śledzi dotknięć.

UITableViewCellAccessoryDetailDisclosureButton Komórka ma przycisk info i obraz w kształcie chevrona jako treść. Ta kontrolka wskazuje, że stuknięcie komórki w komórkę pozwala użytkownikowi skonfigurować zawartość komórki. Znaczniki dotykowe sterują.

UITableViewCellAccessoryCheckmark Komórka ma znacznik wyboru na swojej prawej stronie . Ta kontrola nie śledzi dotknięć. Delegat widoku tabeli może zarządzać znacznikami wyboru w sekcji wierszy (ewentualnie ograniczając znacznik wyboru do jednego wiersza sekcji) w metodzie tableView: didSelectRowAtIndexPath: .

UITableViewCellAccessoryDetailButton Komórka ma przycisk info bez chevronu. Ta kontrola wskazuje, że naciśnięcie komórki powoduje wyświetlenie dodatkowych informacji o zawartości komórki. Dotyki kontrolne są kontrolowane.

0

Jest to inny sposób obsługi przycisku ujawniania za pomocą scenorysu. Powinieneś kliknąć komórkę widoku tabeli i przejść do Inspektora połączeń. Istnieje sekcja o nazwie Triggered Segues i możesz przeciągnąć z linii wyboru do kontrolera UIViewController, do którego chcesz przejść. Segue nastąpi automatycznie i możesz przechwycić prepareForSegue, aby przechwycić powiadomienie, kiedy to nastąpi.
Funkcja accessoryButtonTappedForRowWithIndexPath nigdy nie jest wywoływana dla przycisku ujawnienia. Jest on wywoływany tylko dla przycisku szczegółowego ujawnienia.

3

Konwersja górną odpowiedź Swift 3:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    let unseletcedImage = UIImage(named: "<imagename>") 
    let seletcedImage = UIImage(named: "<imagename>") 
    let button = UIButton(type: .custom) 
    // match the button's size with the image size 
    let frame = CGRect(x: CGFloat(0.0), y: CGFloat(0.0), width: CGFloat((unseletcedImage?.size.width)!), height: CGFloat((unseletcedImage?.size.height)!)) 
    button.frame = frame 
    button.setBackgroundImage(unseletcedImage, for: .normal) 
    button.setBackgroundImage(seletcedImage, for: .selected) 
    cell?.accessoryView = button 
    let action = #selector(checkButtonTapped(sender:event:)) 
    (cell?.accessoryView as? UIButton)?.addTarget(self, action: action, for: .touchUpInside) 
    .... 
    return cell! 

} 

@objc func checkButtonTapped(sender: UIButton?, event: UIEvent) { 
    let touches = event.allTouches 
    let touch = touches!.first 
    guard let touchPosition = touch?.location(in: self.tableView) else { 
     return 
    } 
    if let indexPath = tableView.indexPathForRow(at: touchPosition) { 
     tableView(self.tableView, accessoryButtonTappedForRowWith: indexPath) 
    } 
} 
Powiązane problemy