?做項(xiàng)目的時(shí)候验毡,同事遇到了類似的問題,選中一行時(shí)候帝嗡,cell的重用會會把之前的cell的控件狀態(tài)拿來重用晶通,于是翻出之前的筆記,供大家參考哟玷。
問題狮辽,cell的重用,導(dǎo)致cell里面的控件狀態(tài)如果被改變,隨之影響的可能是第(N)行的Cell也可能會跟著被改變喉脖;
栗子:如果有一個(gè)歌曲下載列表椰苟,有一個(gè)下載按鈕,點(diǎn)擊下載按鈕后树叽,按鈕顯示已下載尊剔,并且修改其為不可點(diǎn)擊狀態(tài);
如圖
假設(shè)菱皆,我們已經(jīng)遵循MVC設(shè)計(jì)來實(shí)現(xiàn)代碼须误,則代碼的修改則極其少,就可避免cell的控件狀態(tài)被復(fù)用仇轻。
關(guān)于用cell的兩點(diǎn)建議:
1.注意cell對應(yīng)的數(shù)據(jù)
2.注意cell的控件狀態(tài)
原理分析:由于cell的重用機(jī)制京痢,會從緩存池里面取出以前的cell,因此篷店,也會取出相對應(yīng)的 cell數(shù)據(jù)和cell控件的狀態(tài)祭椰,因此cell的重用機(jī)制會造成數(shù)據(jù)錯(cuò)亂和cell控件狀態(tài)莫名被影響兩大問題;
cell數(shù)據(jù)在另一篇疲陕,這主要是解決控件狀態(tài)問題方淤。
解決原理很簡單,給數(shù)據(jù)模型添加一個(gè)相對應(yīng)得屬性蹄殃,在需要修改的方法里面賦值携茂,再在設(shè)置數(shù)據(jù)方法中判斷是否該屬性是否為YES,或者相對應(yīng)得枚舉诅岩,由在此確定狀態(tài)應(yīng)該如何顯示讳苦。
1.給數(shù)據(jù)模型添加一個(gè)屬性:(注意,不一定按照這個(gè)格式吩谦,要根據(jù)實(shí)際情況來鸳谜,如果同一個(gè)控件需要幾個(gè)狀態(tài),那明顯用枚舉式廷。)
/**
- 用于判斷控件狀態(tài)
*/
@property (nonatomic,assign,getter=isDownloaded)BOOL downloaded;
2.在需要修改控件的方法中修改你的控件咐扭,并將 給用于控制控件狀態(tài)的屬性賦值;
self.song.downloaded=YES; //這是數(shù)據(jù)模型的屬性
self.btndownload.enabled=NO; //這是需要修改控件的狀態(tài)
3.在設(shè)置數(shù)據(jù)中判斷數(shù)據(jù)中的 downloaded 屬性是否被修改滑废,并且設(shè)置對應(yīng)控件的狀態(tài)蝗肪;
self.btnDown.enabled=self.song.isDownloaded==NO;
在整個(gè)過程中,始終都沒對控制器做任何修改策严,只是改了數(shù)據(jù)模型和相對應(yīng)的 cell 穗慕。
三步搞定饿敲。之前看到有人給每一個(gè)控件添加 tag妻导,再通過 tag 來判斷按鈕是否創(chuàng)建,有多少條數(shù)據(jù)就添加多少個(gè)控件,這樣完全體現(xiàn)不出cell重用倔韭,白白浪費(fèi)了蘋果公司的一番心意了术浪。
這只是一個(gè)思路,通過改數(shù)據(jù)源的屬性狀態(tài)來改cell的控件狀態(tài)寿酌。如果有其他想法歡迎評論交流胰苏。