2013-07-27 18 views
7

Obecnie piszę aplikację, używając storyboardów, który zawiera dwa UITableView s w tym samym oknie.UITableView reloadData nie wydaje się powodować cellForRowAtIndexPath: nazywać się

Podczas uruchamiania aplikacji pierwszy UITableView zostanie wypełniony liczbą "numerów rejestracyjnych".

Gdy użytkownik dotknie komórki, drugi UITableView ma wypełnić szczegóły dotyczące wybranej komórki.

Po naciśnięciu numeru w pierwszej tabeli mam metodę, która napędza:

[mySecondTableView reloadData] 

Który robi. Jestem pod wrażeniem, że podczas wywoływania komendy reloadData, powinien następnie wywołać zarówno:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

i

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

Pierwsze pożary, ale drugi nie. Mam zarówno źródło danych i delegowane przewodowe do siebie.

Nie jestem pewien, czego mi brakuje.

Czy obie metody mają na celu strzelanie?

+4

To również nie jest wcale pewne, że iOS 7 jest jeszcze istotne tutaj; Metody te były obecne w Cocoa Touch na długo przed tą wersją systemu. –

+1

Co to jest return numberOFRowsInSection? Czy to 0? – rdelmar

+0

rdelmar - Nie, 16 obiektów do pokazania i zwraca ten numer. – Fritzables

Odpowiedz

19

Po reloadData, spróbuj tego:

NSIndexSet * sections = [NSIndexSet indexSetWithIndex:0]; 
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationNone]; 

znalazłem jeśli zmiana danych jest subtelna, widok tabeli wydaje się zoptymalizować stąd konieczność odświeżenia.

+0

Z jakiegoś powodu, to faktycznie stała się dla mnie. To jest źle! – OlivaresF

+0

@OlivaresF - Dzięki, to pracował dla mnie, porusza się wewnątrz cellForRowAtIndexPath. ale nie odświeżanie w TableView. –

+0

indexSetwithindex metody nie są już dostępne w Swift, i mam do czynienia z tym samym problem z reloaddata – srinivas

34

Kiedy takie rzeczy mi się przytrafiają, zwykle dzwonię pod numer -reloadData poza głównym wątkiem.

+0

To jest coś, co łatwo przeoczyć, szczególnie podczas pracy z procedurami obsługi zakończeń wywoływanymi z wątków w tle. Doskonała wskazówka. –

+2

Uderzyłem w to głową godzinami. W końcu udało się to po przeczytaniu tego. Dzięki. Uważaj na bloki ukończenia, tak jak mówi Bart. Upewnij się, że wywołasz [tableView performSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: NO] –

1

Właśnie poniosłem ten sam problem. Użyłem performSelectorOnMainThread, aby wywołać metodę, która następnie wywołuje reloadData. Było to konieczne, ponieważ starałem się aktualizować poza głównym wątkiem, jak sugerował hat-fan.

1

Upewnij się nazywają performSelectorOnMainThread z waitUntilDone: NIE, w przeciwnym razie może nadal mają ten sam problem

2

wskazał odpowiedź nie rozwiązuje problemu moim zdaniem stół. Wciąż dzwoni

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

jednak metoda rysunek komórka nie został zwolniony:

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

Moim problemem było to, że (z powodu mojego błędu oczywiście) widok tabeli wysokość była tylko 0. Tak jak wyświetlacze stół widoczne komórki, nigdy nie próbuje wyświetlić komórki. Kiedy zmieniłem wartość wysokości, metoda komórki rysującej zaczęła ponownie się uruchamiać.

Linia Botom sprawdź dwukrotnie swoją ramę stołu i upewnij się, że masz niezerową szerokość i wysokość!

1

Znaleziono inną przyczynę braku wywołania funkcji cellForRowAtIndexPath.

If numberOfRowsInSection zwraca 0, cellForRowAtIndexPath nie zostanie wywołana. Stało się tak w moim przypadku z powodu braku alokacji NSArray podczas zmiany kontrolera widoku i jego następnej liczby (ponieważ była zerowa), zwracając 0.

0

Po kilku dniach uderzania głową w ścianę rozwiązałam mój problem:

Ustaw wszystkie wyjątki przerwania i sprawdzić, czy są coraz poza granicami wyjątku w źródle danych. Bez ustawienia punktu przerwania nie ma awarii, a widok tabeli po prostu nie przeładuje się ponownie.

Pełna odpowiedź here

0

byłem debugowania podobny problem przez kilka godzin, zanim zdałem sobie sprawę, mój .reloadData() połączenie było wykonywane przez zwrotnego poprzedniej instancji kontrolera widoku.

Więc mój punkt przerwania waliła na .reloadData() wezwanie mojego starego wystąpienia tego kontrolera widoku, ale nowa instancja, która została faktycznie nie pokazano przeładunkowych, ponieważ nie był jeden wykonywania zwrotnego że nazwie .reloadData().

Powiązane problemy