attempt to delete row 44 from section 0 which only contains 0 rows before the update
導(dǎo)致的崩潰
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[cell setData:dc.attachments[indexPath.row] andReload:^{
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
}
我們通過reloadRowsAtIndexPaths進(jìn)行更新某個(gè)或者某幾個(gè)Cell的時(shí)候,在tableView內(nèi)部先刪除該Cell石蔗,再進(jìn)行重新創(chuàng)建,如果我們?cè)诟翪ell的時(shí)候如果該Cell是不存在的就會(huì)Crash主慰,attempt to delete row 10 from section 0 which only contains 0 rows before the update(試圖刪除不存在的Cell)
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
如何解決這個(gè)問題呢
1说铃、通過使用reloadData進(jìn)行完全重新加載柔滔;
2、判斷該Cell是否存在朋腋,存在再進(jìn)行reloadRowsAtIndexPaths,這樣就可以避免Crash
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
if (cell) {
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
-》因?yàn)榇颂幨莇atasource中的data變化了齐疙。
-》所以不應(yīng)該調(diào)用reloadRowsAtIndexPaths,而應(yīng)該直接用reloadData旭咽?贞奋??
-》但是不會(huì)導(dǎo)致效率很低嗎穷绵?
有點(diǎn)看懂了:
此處是:
對(duì)于tableView的datasource的數(shù)組:
conversationItemList
最開始conversationItemList是空的轿塔,count是0
此處之前已經(jīng)調(diào)用了:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("ConversationViewController numberOfRowsInSection")
return conversationItemList.count
}
所以當(dāng)時(shí)是numberOfRowsInSection返回的是0
而此處雖然是已經(jīng)添加數(shù)據(jù)了:
if conversationItemList.count == 0 {
conversationItemList.append(newConversationItem)
}
else {
conversationItemList.insert(newConversationItem, atIndex: newInsertItemIdx)
}
但是此時(shí)tableView并不知道你的數(shù)據(jù)源變化了
-》所以此時(shí)調(diào)用reloadRowsAtIndexPaths,發(fā)現(xiàn):
section 0中仲墨,并沒有數(shù)據(jù)
而reload需要
先刪除delete
再添加add
所以此時(shí)delete不存在的row的話勾缭,就報(bào)錯(cuò)了。
-》所以目养,此處應(yīng)該是先調(diào)用reloadData
-》讓系統(tǒng)知道數(shù)據(jù)變化了俩由。
iphone – Crash on reloadRowsAtIndexPath but not on reloadData – Stack Overflow
中的解釋,也和我猜的一樣: