2016-11-01 14 views
15

Występuje awaria podczas usuwania wiersza.Awaria z brakującą komórką dla nowo widocznego wiersza podczas aktualizowania UITableView

// Updating my data model 
.... 
// apply the updates 
self.tableView.beginUpdates() 
self.tableView.deleteRows(at: indexPathsToDelete, with: .automatic) 
self.tableView.endUpdates() 

Kroki prowadzące do odtworzenia - dodaj wiersze - Usuwanie wierszy, w szczególności upewniając się tam kilka wierszy poza bieżącym ekranie (który będzie wówczas na ekranie, gdy delecja jest udany - Powtarzaj, aż awaria

to nie zawsze się tak mój najlepszy przypuszczenie to, że stanie się to tylko wtedy, gdy komórki nie próbuje załadować się recyklingowi

to jest w 10,0 symulatora z Xcode 8.0

Kod
*** Assertion failure in -[UITableView _updateWithItems:updateSupport:], 
/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UITableView.m:3149 
Missing cell for newly visible row 2 
(null) 

dla cellForRowAt

if isMultipe{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: DetailsTableViewCell.defaultIdentifier, for: indexPath) as! DetailsTableViewCell 
return cell 
    } else { 
let cell = tableView.dequeueReusableCell(withIdentifier: DetailsMultipleTableViewCell.defaultIdentifier, for: indexPath) as! DetailsMultipleTableViewCell 
    return cell 
} 

tego samego błędu zgłaszane tutaj: https://forums.developer.apple.com/thread/49676

+0

W jaki sposób kasujesz swoją komórkę? Czy możesz pokazać swój kod w 'cellForRow ...'? –

+0

@Hoa pytanie zaktualizowano – iOSGeek

+0

Zarejestrowałeś plik .xib w klasie komórki i w razie potrzeby usunięto go. Być może jest problem z iOS10, ale spróbuj sprawdzić, czy twoja komórka nie jest 'nilowa ', czy nie po linii' dequeueReusableCell'. –

Odpowiedz

0

Usuń indexPath w tableView.dequeueReusableCell

if isMultipe{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: DetailsTableViewCell.defaultIdentifier) as! DetailsTableViewCell 
return cell 
    } else { 
let cell = tableView.dequeueReusableCell(withIdentifier: DetailsMultipleTableViewCell.defaultIdentifier) as! DetailsMultipleTableViewCell 
    return cell 
} 
+0

Mam już dequeueReusableCell bez indeksu IndexPath i nadal uderza w ten błąd ..... – Mobigital

6

miałem ten sam problem i okazało się, że UITableView ma poważne problemy z animacją wstawiania/aktualizowania/usuwania wierszy, gdy nagłówki sekcji mają zmienną wysokość. Po prostu zmień wysokość na stałą i spróbuj ponownie.

To faktycznie oznacza usunięcie estimatedSectionHeaderHeight.

+0

Ale 'heightForHeaderInSection' jest ok mieć? Czy też musisz to usunąć. – tettoffensive

+0

@tettoffensive 'heightForHeaderInSection' ma się dobrze. – emrekyv

+1

Wygląda na to, że nawet bez 'estimSectionHeaderHeight' nadal można uzyskać' brakującą komórkę dla nowo widocznego wiersza ## ' – Mobigital

1

W moim przypadku nastąpiło awarie, gdy komórki używały autolayout do obliczenia wysokości. Dlatego jedynym gwarantowanym rozwiązaniem jest użycie ręcznych wysokości obliczeniowych. (Co jest rzeczywiście smutne ..)

+0

To właśnie mam w końcu robić, ale powinno być wyjaśnienie – iOSGeek

+0

Czy użyłeś autouzupełniania dla samej komórki? Już wyłączyłem autolayout do obliczania wysokości, ale nadal używam autolayout do pozycjonowania subviews. Nadal dostaję błąd. – ordinaryman09

0

W moim przypadku miałem ten problem tylko do wrzucania pierwszy wiersz do pustego odcinka, więc starałem się naprawić to tak:

self.array.append(item) 
if self.array.count > 1 { 
    self.tableView.beginUpdates() 
    self.tableView.insertRows(at: indexPathes, with: .top) 
    self.tableView.endUpdates() 
} else { 
    self.tableView.reloadSections([1], with: .fade) 
} 
0

miałem podobny problem.

emrekyv zaproponował usunięcie estimatedSectionHeaderHeight, ale mam tabelę z jednym seaction i bez nagłówka i stopki.

Poszerzenie pomysłu i ustawienie estimatedRowHeight na 0 (= nieautomatyczne) naprawiło problem.

Zatem zasada:

podczas aktualizowania UITableView Nie oszacować dowolnej wysokości.