2009-05-08 8 views
5

Bardzo ważna jest tutaj pomoc!Problem z odświeżaniem komórki UITableView w przearanżowaniu

Mam niestandardową komórkę UITableView, składającą się z obrazu (zielony, pomarańczowy lub czerwony) i dwóch etykiet o różnych rozmiarach czcionki. UITableView jest sterowany przez NSMutableArray obiektów.

UITableView jest podzielony na trzy sekcje, z pierwszą sekcją zawierającą wszystkie komórki z czerwonym obrazem, drugą sekcję z pomarańczową, trzecią sekcją z zieloną.

Zaimplementowałem możliwość zmiany układu komórek w ramach UITableView, co pozwala użytkownikowi przeciągnąć, powiedzmy, element z czerwonym obrazem z czerwonej sekcji do sekcji pomarańczowej. Takie przeciąganie działa świetnie, a podstawowe dane są poprawnie aktualizowane. Wiem, że tak jest, ponieważ jeśli wybiorę komórkę, przejdę do jego widoku szczegółów i dane zostaną zaktualizowane.

Jednak UITableView nie aktualizuje się, dopóki nie przejdę do szczegółów (lub zamknąć aplikację) i wrócić! Aktualizuje się również, gdy przewijam nieprawidłową komórkę z widoku i ponownie wyświetlam ją, więc tablica zawiera wyraźnie poprawne dane. Po prostu nie mogę uruchomić odświeżania widoku!

Próbowałem następujące po kodzie zmiany podstawowych danych w moveRowAtIndexPath:

[self.tableView reloadData]; 

Jednak powoduje to wyjątek. Apple Language Reference w rzeczywistości mówi, że reloadData nie może zostać wywołana podczas wstawiania, usuwania lub animowania, co oczywiście robię. Ponadto próba odświeżenia komórki za pomocą nie jest możliwa (chociaż nie ulega również awarii).

Jakieś pomysły dotyczące odświeżenia widoku UITableView? Nie mogę znaleźć metody afterMoveHasBeenCompleted: cokolwiek, więc jeśli nie mogę wywołać metody reloadData podczas mojej metody moveRowAtIndexPath :, to gdzie ją nazwać ?!

Odpowiedz

4

Got to !!

Odkryłem, że rozwiązaniem było opóźnienie w odświeżaniu kodu, co uniemożliwiło awarię.

umieścić wezwanie reloadData do osobnej metody:

- (void)refreshDisplay:(UITableView *)tableView { 
[tableView reloadData]; } 

a następnie nazwał go z 0,5 sekundowym opóźnieniem:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

I nie upaść i zamiast odświeżony! Opóźnienie 0,5 s jest ledwo zauważalne i całkowicie akceptowalne.

Mam nadzieję, że to pomoże komuś innemu!

Dzięki

Phil

+3

A może to tylko brudny hack? Czy istnieje metoda "animationComplete", którą mogę zamiast tego użyć? ... – h4xxr

+0

To wydaje się być najlepszym sposobem, aby to zrobić, zgodnie z postem gpmoore w tym wątku dla programistów Apple: http://discussions.apple.com/thread.jspa ? messageID = 8450874 – Tim

+0

To frustrujące, ale bardzo uspokajające! Dzięki! – h4xxr

2

Zapoznaj się z odnośnikiem dla UITableViewDelegate. Jeśli przypiszesz UITableView delegatowi, możesz użyć jego metod do obsługi powiadomień, które zrobił widok tabeli. Prawdopodobnie użyjesz jednego z

tableView:didEndEditingRowAtIndexPath:
lub
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
, aby to osiągnąć.

+0

Niestety tableView: didEndEditingRowAtIndexPath tylko wydaje się wyzwolić po przerywania "side-swipe" działania. Nawet jeśli udało mi się śledzić punkt, w którym zakończono edycję (tj. Kiedy użytkownik kliknie "gotowe"), obrazy będą nadal błędne aż do tego momentu. Inna metoda, którą sugeruję, już używam, aby umożliwić przeciąganie i upuszczanie tylko do innych sekcji. To minęło, zanim dowiem się, czy muszę odświeżyć czy nie. – h4xxr