2012-05-01 64 views
6

Mam widok tabeli, w którym komórki są budowane inaczej, w zależności od tego, czy tabela jest edytowana, czy nie. Konkretnie, styl selekcji ma wartość zero w trybie edycji i niebieski, gdy nie jest w trybie edycji.Przerysowywanie UITableViewCell podczas wchodzenia/wychodzenia z trybu edycji

Po przejściu z jednego do drugiego zauważyłem, że niektóre komórki nie są aktualizowane. Szybkie rejestrowanie mówi mi, że nawet jeśli wygląd komórek zmienia się dość drastycznie (widoki akcesoriów są dodawane/usuwane poprawnie na przykład) widok tabeli nie odświeża stylu selekcji (ani nie ma znaczenia tekst).

Co się tutaj dzieje? Czy tylko niektóre atrybuty komórki zostały zaktualizowane po wywołaniu setEditing? Przypuszczalnie tylko te, które mają określoną metodę pozwalającą na przypisanie oddzielnego stylu widoku (na przykład EditingAccessoryType)? Sądzę, że skorzystałbym z EditingSelectionStyle.

Jak mam to rozwiązać? Dostosowując setEditing, aby zmienić selectionStyle dla każdej komórki? Nie jestem nawet pewien, jak wykonać iterację w widoku tabeli, aby to zrobić. reloadData nie jest opcją z powodu niektórych animacji, których używam.

Odpowiedz

6

Znalazłem, że dostosowywanie setEditing: do iteracji poprzez widoczne komórki i ustawienie selectionStyle dla każdego działa poprawnie.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{ 
    [super setEditing:editing animated:animated]; 

    for (UITableViewCell *cell in [self.tableView visibleCells]) { 
      NSIndexPath *path = [self.tableView indexPathForCell:cell]; 
      cell.selectionStyle = (self.editing && (path.row > 1 || path.section == 0)) ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue; 
    } 
} 
+7

Dlaczego miałbyś to zrobić zamiast przesłonić setEditing: animated: w komórce? – jrturton

+0

Dzięki @jrturton, Twoja odpowiedź jest bardziej elegancka. – xialin

+0

@jrturton, czy możesz dodać swój komentarz jako odpowiedź? – phatmann

2

Jeśli spojrzysz na UITableViewDelegate documentation zobaczysz, że istnieje pięć metod dostosowania edycji. Istnieje również metoda

- (BOOL)tableView:(UITableView *)tableView 
canEditRowAtIndexPath:(NSIndexPath *)indexPath 

w UITableViewDataSource documentation która zostanie wywołana na każdej komórki, zanim przejdzie w tryb edycji. To samo jest prawdziwe, aby uzyskać wywołanie dla wszystkich komórek, które można edytować. Jeśli chcesz zmienić wygląd komórek, możesz to zrobić w dowolnym z nich. (Nie wdrażaniu canEditRow.. zakłada, wszystkie wiersze są edytowalne.)


Należy również pamiętać, że mogą istnieć inne sposoby, aby wejść do trybu edycji, takich jak przesuwając na komórce, w którym to przypadku

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

zostanie wywołana dla komórki, który przesuwany na:

po wejściu do tego „swipe usunąć” tryb edycji, widok tabeli wysyła tableview: willBeginEditingRowAtIndexPath: wiadomość do delegata, aby umożliwić to, aby dostosować go s interfejs użytkownika.

+0

Jest to przydatne informacje, ale tak naprawdę nie rozwiązuje kwestię. Chcę wiedzieć, czy muszę dostosować setEditing: iterować po wszystkich visibleCells i ustawić styl selekcji, ponieważ nie jest automatycznie aktualizowany przez setEditing: - Odpowiedź brzmi: tak, robię. –

+0

Tak, jedynym dostosowaniem, które dzieje się automatycznie dla ciebie jest to, że zawartość viewView tableViewCell jest zmieniana po pojawieniu się przycisków deleteButton. Jeśli chcesz dostosować coś więcej, musisz zaimplementować jedną lub więcej z tych metod. –

+0

Chociaż zauważyłem, że etykieta tekstowa jest również automatycznie aktualizowana. –

0

Działa to na Swift 2.3, tylko nadpisanie metody setEditing w Twojej podklasy komórek:

class MyCell: UITableViewCell { 

    override func setEditing(editing: Bool, animated: Bool) { 
     super.setEditing(editing, animated: animated) 
     //Place your code here... 
    } 

} 
Powiązane problemy