我無法理解這是如何工作的。我已經閱讀了關於它的許多線索 - 例如UITableView dequeueReusableCellWithIdentifier Theory和How does dequeueReusableCellWithIdentifier: work?。瞭解UITableView dequeueReusableCellWithIdentifier - 即使在第一次調用時也返回單元格
但是,即使在第一次加載時,我的UITableView每次都會成功地將某個單元出隊(它永遠不會爲零)。我的印象是,類似的單元格應該使用相同的標識符,所以你只需要改變必要的東西。
因爲
if (!cell) {
NSLog(@"New cell");
cell = [[UITableViewCell alloc] initWithStyle:someStyle reuseIdentifier:someIdentifier];
}
不會被調用,我不知道我應該如何處理細胞與不同風格的同桌,因爲風格只能在初始化設置。
我也嘗試過使用不同的單元格標識符,以確保它不會重複使用來自不同表格或其他東西的單元格。我正在使用[tableView registerClass: forCellReuseIdentifier:]
註冊這些標識符如果我明白了,此方法應該只返回先前創建的已移出屏幕(隱藏,即可重用)的單元格。那麼它是如何在第一次被叫時返回一個單元呢?
編輯:所以混淆使用[tableView dequeueReusableCellWithIdentifier: forIndexPath:]
代替[tableView dequeueReusableCellWithIdentifier:]
(第一要求註冊標識符,所述第二將返回nil如果沒有可用的 - 的行爲我上面期待)。
但是,我注意到當我將代碼更改爲使用[tableView dequeueReusableCellWithIdentifier:]
時,它創建了一個新的單元格,其contentView.frame
的寬度爲320(全寬)。之前,當我做了dequeue...forIndexPath
它會給出302的寬度,或者單元格的視覺/「真實」寬度。爲什麼是這樣?
此外,有沒有一種方法來指定UITableViewCells regstiered的樣式重用?
解決方案:所以我發現這個線程UITableView cell.contentView.bounds.size.width Changes With Cell Reuse,它說,當你設置autoresizingmask到UIViewAutoresizingFlexibleLeftMargin,當你嘗試做相對定位它是固定的(在內容查看寬度是最初的完全寬度,但是當你目前它縮小了,所以如果你做了計算,它仍然會正常顯示)。
我在右邊定位了一個UISwitch - 當我設置自動調整屏蔽時,它首先顯示,但是當我切換時它會移動另外的20個像素。我不知道是什麼導致了額外的轉換,但我最終通過簡單地將UISwitch設置爲單元的附件視圖來解決它。
(這是部分偏離原來的問題,但如果有人絆倒這可能會有用)。對於任何人想知道的原始問題,答案是在第一次編輯。
您的單元格是從故事板創建到UITableViewController中的嗎? – danypata
所有以編程方式創建...是啊,很多人都說使用故事板...但我還沒有習慣它,而且我覺得我會更好地理解它,知道什麼是真正理解 – Raekye
沒有問題,但我想知道,因爲當你從故事板創建單元格到UITableViewContoller時,'deque '方法總是會返回一個有效的單元格(如果使用了正確的標識符) – danypata