iOS UITableView的cell重用標識

2022-08-03 15:18:20 字數 3765 閱讀 1619

**  

uitableview繼承自uiscrollview,是蘋果為我們封裝好的乙個基於scroll的控制項。上面主要是乙個個的 uitableviewcell,可以讓uitableviewcell響應一些點選事件,也可以在uitableviewcell中加入 uitextfield或者uitextview等子檢視,使得可以在cell上進行文字編輯。

uitableview中的cell可以有很多,一般會通過重用cell來達到節省記憶體的目的:通過為每個cell指定乙個重用識別符號 (reuseidentifier),即指定了單元格的種類,當cell滾出螢幕時,會將滾出螢幕的單元格放入重用的queue中,當某個未在螢幕上的單 元格要顯示的時候,就從這個queue中取出單元格進行重用。

但對於多變的自定義cell,有時這種重用機制會出錯。比如,當乙個cell含有乙個uitextfield的子類並被放在重用queue中以待重用,這 時如果乙個未包含任何子檢視的cell要顯示在螢幕上,就會取出並使用這個重用的cell顯示在無任何子檢視的cell中,這時候就會出錯。

解決方法:

方法1 將獲得cell的方法從- (uitableviewcell*)dequeuereusablecellwithidentifier: (nsstring*)identifier 換為-(uitableviewcell *)cellforrowatindexpath:(nsindexpath *)indexpath

重用機制呼叫的就是dequeuereusablecellwithidentifier這個方法,方法的意思就是「出列可重用的cell」,因而只要將 它換為cellforrowatindexpath(只從要更新的cell的那一行取出cell),就可以不使用重用機制,因而問題就可以得到解決,雖然 可能會浪費一些空間。

示例**:

[plain]

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**                              

}- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**                             

}方法2 通過為每個cell指定不同的重用識別符號(reuseidentifier)來解決。

重用機制是根據相同的識別符號來重用cell的,識別符號不同的cell不能彼此重用。於是我們將每個cell的識別符號都設定為不同,就可以避免不同cell重用的問題了。

示例**:

[plain]

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**

}- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**

}方法3 刪除重用cell的所有子檢視

這個方法是通過刪除重用的cell的所有子檢視,從而得到乙個沒有特殊格式的cell,供其他cell重用。

示例**:

[plain]

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

else

}//...其他**

}**  

uitableview繼承自uiscrollview,是蘋果為我們封裝好的乙個基於scroll的控制項。上面主要是乙個個的 uitableviewcell,可以讓uitableviewcell響應一些點選事件,也可以在uitableviewcell中加入 uitextfield或者uitextview等子檢視,使得可以在cell上進行文字編輯。

uitableview中的cell可以有很多,一般會通過重用cell來達到節省記憶體的目的:通過為每個cell指定乙個重用識別符號 (reuseidentifier),即指定了單元格的種類,當cell滾出螢幕時,會將滾出螢幕的單元格放入重用的queue中,當某個未在螢幕上的單 元格要顯示的時候,就從這個queue中取出單元格進行重用。

但對於多變的自定義cell,有時這種重用機制會出錯。比如,當乙個cell含有乙個uitextfield的子類並被放在重用queue中以待重用,這 時如果乙個未包含任何子檢視的cell要顯示在螢幕上,就會取出並使用這個重用的cell顯示在無任何子檢視的cell中,這時候就會出錯。

解決方法:

方法1 將獲得cell的方法從- (uitableviewcell*)dequeuereusablecellwithidentifier: (nsstring*)identifier 換為-(uitableviewcell *)cellforrowatindexpath:(nsindexpath *)indexpath

重用機制呼叫的就是dequeuereusablecellwithidentifier這個方法,方法的意思就是「出列可重用的cell」,因而只要將 它換為cellforrowatindexpath(只從要更新的cell的那一行取出cell),就可以不使用重用機制,因而問題就可以得到解決,雖然 可能會浪費一些空間。

示例**:

[plain]

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**                              

}- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**                             

}方法2 通過為每個cell指定不同的重用識別符號(reuseidentifier)來解決。

重用機制是根據相同的識別符號來重用cell的,識別符號不同的cell不能彼此重用。於是我們將每個cell的識別符號都設定為不同,就可以避免不同cell重用的問題了。

示例**:

[plain]

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**

}- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**

}方法3 刪除重用cell的所有子檢視

這個方法是通過刪除重用的cell的所有子檢視,從而得到乙個沒有特殊格式的cell,供其他cell重用。

示例**:

[plain]

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

else

}//...其他**

}

IOS UITableView下拉重新整理

給 uitableview 新增 下拉重新整理 pull refresh 屬性 親愛的,我還是有些不忍心,不過事情的經過是這樣的 cocoa touch 的 官方 sdk 裡,壓根就沒實現這個 pull refresh 的功能。恩,這事真不是賈伯斯手下幹的。然而也不是麻匪幹的。是他幹的,enorme...

iOS UItableview重用機制

重用機制的定義就是乙個節省記憶體的機制,當我們的tableview有100或更多資料是如果沒有重用機制那樣會把記憶體很快佔滿 尤其使大多數我們在cell上面放上,是乙個很佔記憶體的東西 所以我們需要重用機制來解決,重用機制就是在我們螢幕的可顯示範圍內建立cell 其餘的復用這些cell,以我個人的理...

iOS UITableView划動刪除的實現

標籤 划動刪除 iphone 滑動刪除 iosuitableview 原始出處 作者資訊和本宣告。否則將追究法律責任。先前的準備工作 第一步,準備好資料來源.import inte ce uitablecellswapdeleteviewcontroller uiviewcontroller pro...