2016-11-01 84 views
15

我在刪除一行時遇到崩潰。當更新UITableView時出現新單元丟失單元格丟失

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

步驟來重現 - 添加行 - 刪除行,特別是確保有當前屏幕之外的一些行(然後,將在屏幕上時,刪除成功 - 重複,直到發生崩潰

它並不總是發生,所以我最好的猜測是,當它試圖加載細胞得到回收

這是在10.0模擬器和Xcode 8.0

它只會發生對於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 
} 

相同的錯誤

*** 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) 

代碼這裏報告:https://forums.developer.apple.com/thread/49676

+0

您如何讓您的細胞出院?你可以在'cellForRow ...'中顯示你的代碼嗎? –

+0

@Hoa問題已更新 – iOSGeek

+0

因此,您將.xib註冊到單元類並在需要時將其解除出隊。 iOS10可能存在問題,但嘗試檢查您的單元格是否爲「無」或不在「dequeueReusableCell」行之後。 –

回答

0

在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

我已經有dequeueReusableCell沒有indexPath,仍然發生這個錯誤..... – Mobigital

6

刪除indexPath我有同樣的問題,我發現UITableView在節標題變高時動畫插入/更新/刪除行存在嚴重問題。只需將高度轉換爲一些常量並再次嘗試。

這實際上意味着刪除estimatedSectionHeaderHeight

+0

但是'heightForHeaderInSection'可以有嗎?或者你也必須刪除它。 – tettoffensive

+0

@tettoffensive'heightForHeaderInSection'很好。 – emrekyv

+1

看起來,即使沒有'estimatedSectionHeaderHeight',你仍然可以'丟失單元格爲新的可見行##' – Mobigital

1

在我的情況下,當單元格使用自動佈局來計算它的高度時,它會崩潰。所以,唯一有保證的解決方案是使用手動計算高度。 (什麼是真正可悲的..)

+0

這就是我最終做的,但應該有一個解釋 – iOSGeek

+0

你使用自動佈局的單元格本身?我已經關閉了自動佈局以計算高度,但我仍然使用自動佈局來定位子視圖。雖然我仍然收到錯誤。 – ordinaryman09

0

在我來說,我有這個問題,只是在第一行插入一個空的部分,所以我試圖修復它是這樣的:

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

我也有類似問題。

emrekyv建議刪除estimatedSectionHeaderHeight但我有一張桌子,有一個正面,沒有標題,沒有頁腳。

擴大他的想法並將estimatedRowHeight設置爲0(=不自動)解決了問題。

所以規則是:

更新一個UITableView時,不要估計任何高度。