2014-05-16 17 views
5

Moja funkcja UITableView ma włączoną funkcję przesunięcia palcem, aby usunąć. Każda komórka ma numer UIButton, który wykonuje akcję (w tym przypadku wykonaj segue).Przesuń, aby usunąć komórkę, nie anuluj akcji UIButton

Spodziewam się, że po przesunięciu komórki przez dotknięcie przycisku działanie przycisku zostanie anulowane/zignorowane i będzie obsługiwane tylko przesunięcie. Faktycznie dzieje się tak, że oba gesty (przesuwanie + dotknięcie) są wykrywane i obsługiwane.

Oznacza to, że jeśli chcę tylko usunąć jedną komórkę i "przypadkowo" przesunąć, dotykając przycisku, aplikacja przejdzie do następnego ekranu.

Jak mogę zmusić moją aplikację do zignorowania kranów w tym przypadku?

Odpowiedz

9

Augusta był na tyle miły dla mnie, ale zorientowali się, jak sprawić, by było jeszcze lepiej:

Sprawdzanie, czy stół był na tryb edycji, aby zdecydować, czy przycisk powinien wykonywać swoje działanie uczyni go Zachowuj się tak, jak powinno, ale nadal będzie problem z doświadczeniem użytkownika:

Jeśli użytkownik chce wyjść z trybu edycji, powinien być w stanie dotknąć dowolnego miejsca w komórce, aby to osiągnąć, w tym przycisku. Jednak działanie UIButton jest nadal analizowane przez aplikację, a dotknięcie przycisku nie spowoduje wyjścia z trybu edycji.

Rozwiązanie znalazłem wyłączyć interakcji użytkownika na przycisku przy jednoczesnym wejściu w tryb edycji, a następnie włączyć ją ponownie, kiedy to się robi:

// View with tag = 1 is the UIButton in question 
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:NO]; 
} 

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:YES]; 
} 

ten sposób przeciągnąć przycisk, aby wejść w tryb edycji nie wywoła skargę Buttona , i nagrywanie go, aby wyjść z trybu edycji, wyjdzie z trybu edycji.

2

Jednym z eleganckich sposobów byłoby ignorowanie naciśnięć przycisków tak długo, jak komórka wchodzi w tryb edycji. Działa to, ponieważ gest przesunięcia, aby usunąć, spowoduje wywołanie funkcji willBeginEditingRowAtIndexPath przed wywołaniem działania stuknięcia przycisku. Odpowiedź

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.isEditing = YES; 
} 

- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.isEditing = NO; 
} 

// button tapped 
- (IBAction)tap:(id)sender 
{ 
    if (self.isEditing) { 
     NSLog(@"Ignore it"); 
    } 
    else { 
     NSLog(@"Tap"); 
     // perform segue 
    } 
} 
+0

Dobrze pomyślane! Ponadto 'UITableView' ma już flagę właściwości' editing' (getter 'isEditing'), więc nie ma potrzeby jej tworzenia. – Guilherme

+0

To była ogromna pomoc! –

2

Jest możliwe, aby to zrobić także w podklasie komórki za:

override func setEditing(editing: Bool, animated: Bool) { 
    super.setEditing(editing, animated: animated) 

    actionButton?.userInteractionEnabled = !editing 
} 
0

Ponieważ moja funkcja jest wywoływana z naciśnięcie przycisku był delegatem na moje główne klasy UITableViewController „s i podłączony do UITableViewCell jako IBAction, przycisk w moim UITableViewCell wciąż był uruchamiany przy przesunięciu, które spowodowało wciśnięcie UIButton jako części przesunięcia.

Aby temu zapobiec, użyłem tych samych delegatów UITableView jako zaakceptowanej odpowiedzi, ale musiałem ustawić zmienną poziomu pliku, aby monitorować, czy edycja była przeprowadzana.

// in custom UITableViewCell class 
@IBAction func displayOptions(_ sender: Any) { 
    delegate?.buttonPress() 
} 

// in UITableViewController class that implemented delegate 
fileprivate var cellSwiped: Bool = false 

func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) { 
    cellSwiped = true 
} 

func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) { 
    cellSwiped = false 
} 

func displayContactsSheet(for contact: Contact) { 
    if cellSwiped { 
     return 
    } 
    // proceed with delegate call button press actions 
} 
Powiązane problemy