2014-03-25 54 views
1

所有,的UITableView細胞重新初始化每次在iOS的7

我希望大多數人都知道,與ios7有沒有需要做一個空支票的tableview重用

if (cell == nil) { 

但遺憾的是,由於單元總是被重新初始化,因爲我們把代碼放在同一個初始化值的方法中。但問題是隻有在tableview中的文本字段。

讓我來解釋一下這個場景。我有一個包含多行的表格視圖,有些行包含多個文本框。當頁面加載時,我使用來自服務器的數據填充文本框。由於細胞總是被重新初始化,正如我上面所解釋的那樣,無論我在該領域輸入什麼都會消失,並且一旦向下滾動並回到初始階段,就會重新填充服務器數據。這是因爲填充數據代碼也是在同一個地方。獲取可重用單元后,它會填充數據。

此前直到iOS6的,我們使用如果(細胞==零),因此我們裝載在細胞內部服務器數據和再使用細胞時,這一段代碼將永遠不會被調用。

我有其他骯髒的解決方案,但想知道是否有其他人有一個優雅的方式來處理此問題。請幫忙。

+4

您只是不在表格視圖單元格中存儲任何數據,而是在填充表格單元格的模型中存儲任何數據。這總是應該完成的方式。 – rckoenes

+0

@rckoenes你的解決方案似乎是正確的。我們是否總是需要將模型與每個單元相關聯? – Kesava

+1

這是最常用的方法,因爲'UITableViewCell'只是一個視圖,並且被iOS重用。從MVC的角度來看,然後是的,你應該總是使用一個模型。 – rckoenes

回答

2

您只是不在表格視圖單元格中存儲任何數據,而是在填充表格單元格的模型中存儲任何數據。這總是應該完成的方式。

自MVC觀點來看比UITableViewCell尋找是一個視圖。由於它被iOS重用,您應該使用模型來查看視圖。

+0

你是否建議每當我們在文本字段中輸入內容時,它應該使用文本字段的委託方法在模型中持久化? – Kesava

+0

這是有道理的,因爲模型正在顯示數據。 – rckoenes

+0

不會成爲一個非常複雜的解決方案嗎?這不是一個普遍的問題嗎?沒有任何好的方法來做到這一點? – Kesava

0

是的,這是UITableView的預期行爲。出於性能原因,單元格被重用。因此,每次調用tableView:cellForRowAtIndexPath:時,都有責任在表視圖單元中填充視圖。

我不從你的問題理解的事 - 你在做每一次細胞映入眼簾的網絡電話?如果是這樣,請將結果緩存在某處。或者,如果數據量很小,可以考慮在開始時一次性完成(仍然需要異步)。

我看到很多開發人員所做的一件事是將大量代碼移入UITableViewCell子類,這聽起來像是一個好主意,因爲它是模塊化的,但卻爲這樣的問題提供瞭解決方案更加困難。表視圖數據源管理網絡調用。

如果您需要一些靈感,請參閱Apple的LazyTableImages示例。

+0

不,我不會爲每個細胞進行網絡通話。我認爲你沒有正確理解我的問題 – Kesava