UICollection代理方法didSelectItemAtIndexPath和didDeselectItemAtIndexPath調(diào)用的問題

需求:

  • 點(diǎn)擊一個(gè)cell, 會(huì)調(diào)用didSelectItemAtIndexPath:方法,然后點(diǎn)擊另外一個(gè)cell,首先會(huì)調(diào)用didDeselectItemAtIndexPath:這個(gè)方法,然后在調(diào)用didSelectItemAtIndexPath:方法

問題:

  • 當(dāng)然實(shí)現(xiàn)這個(gè)需求非常容易,但是當(dāng)你在didSelectItemAtIndexPath中調(diào)用reloadItemsAtIndexPaths或者reloadData這兩個(gè)方法(經(jīng)常在這個(gè)方法中我們用來修改模型數(shù)據(jù),并使用這兩個(gè)方法來刷新cell上面的顯示),來刷新cell上面的數(shù)據(jù)的時(shí)候,就會(huì)發(fā)現(xiàn),didDeselectItemAtIndexPath這個(gè)方法不會(huì)調(diào)用了.

原因

  • 我稍微分析了下原因.在調(diào)用reloadItemsAtIndexPaths或者reloadData,系統(tǒng)內(nèi)部是會(huì)調(diào)用數(shù)據(jù)源方法cellForItemAtIndexPath:, 而在這個(gè)方法里面,cell的selected屬性又重新被初始化為NO了,所以此時(shí)cell的是處于非選中狀態(tài)的,自然就不會(huì)調(diào)用didDeselectItemAtIndexPath:這個(gè)方法來取消選中.

解決方法分析

  • 找到了原因,那么我們開始想辦法.
  • 我們也許可以在cellForItemAtIndexPath:這個(gè)方法中手動(dòng)來設(shè)置cell的狀態(tài)(這里設(shè)置cell的狀態(tài)就是cell的最終狀態(tài),因?yàn)檫@個(gè)方法最后調(diào)用的).我們馬上就可以想到有2個(gè)方法也許可以修改cell的selected屬性
    • 第一種: cell的selected屬性: 讓我們看看官方的解釋

      This property manages the selection state of the cell only. The default value of this property is NO, which indicates that the cell is not selected.
      

You typically do not set the value of this property directly. Changing the value of this property programmatically does not change the appearance of the cell. The preferred way to select the cell and highlight it is to use the selection methods of the collection view object.
這個(gè)屬性僅僅是用于管理cell的選中狀態(tài).默認(rèn)這個(gè)值為NO.意味著cell默認(rèn)情況下是沒有被選中的.
通常情況下,不要直接設(shè)置這個(gè)屬性.使用代碼來改變這個(gè)值并不會(huì)改變cell的外觀.選中cell,并讓cell顯示高亮狀態(tài)最好的方法就是調(diào)用UICollectionView相關(guān)selection方法來實(shí)現(xiàn).
```
- 官方也建議我們不要直接來設(shè)置,直接設(shè)置的話有可能并不會(huì)達(dá)到你想要的效果.經(jīng)過我的測試,直接設(shè)置確實(shí)沒有作用.同學(xué)們可以自己去試一下
- 第二種: -[UICollectionView selectItemAtIndexPath:animated:scrollPosition:]
- 這個(gè)方法可能就是蘋果官方建議的通過UICollectionView的對(duì)象方法來設(shè)置cell的選中狀態(tài).
- 還是讓我們看看官方的解釋

    ```objc
    If the allowsSelection property is NO, calling this method has no effect. If there is an existing selection with a different index path and the allowsMultipleSelection property is NO, calling this method replaces the previous selection.

This method does not cause any selection-related delegate methods to be called.
如果allowsSelection屬性為NO, 調(diào)用這個(gè)方法沒有任何效果.
如果有任何另外一個(gè)已經(jīng)被選中cell(官方的說明是另外一個(gè)索引, 同一個(gè)意思)并且allowsMultipleSelection(允許多項(xiàng)選擇)這個(gè)屬性為NO, 那么調(diào)用這個(gè)方法會(huì)取代那個(gè)cell的選中狀態(tài).
也就是說當(dāng) allowsSelection = YES (默認(rèn)就是YES), allowsMultipleSelection = NO(這個(gè)也是默認(rèn)設(shè)置), 調(diào)用這個(gè)方法就會(huì)取消上一個(gè)cell的選中狀態(tài),然后讓當(dāng)前的cell選中.
```

- 看完官方的解釋,相信大家都明白了,剛好就是我們需要的屬性

最終解決方案

  • 綜上所述, 如果你在didSelectItemAtIndexPath:didDeselectItemAtIndexPath這兩個(gè)方法中調(diào)用了reloadItemsAtIndexPaths或者reloadData這兩個(gè)方法來刷新cell上面顯示的數(shù)據(jù),但是發(fā)現(xiàn),didDeselectItemAtIndexPath這個(gè)代理方法并沒有調(diào)用,你只需要做出如下的配置即可

    // 這兩個(gè)屬性都是默認(rèn)配置的,如果你沒有修改的話,就不用寫
    allowsSelection = YES;
    allowsMultipleSelection = NO;
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    

{
// 需要配置的代碼
[collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
}
```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殿雪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油够,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耸黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篮幢,“玉大人,你說我怎么就攤上這事三椿∪本” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵搜锰,是天一觀的道長。 經(jīng)常有香客問我蛋叼,道長狐胎,這世上最難降的妖魔是什么握巢? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮镜粤,結(jié)果婚禮上肉渴,老公的妹妹穿的比我還像新娘公荧。我一直安慰自己,他們只是感情好同规,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布循狰。 她就那樣靜靜地躺著,像睡著了一般券勺。 火紅的嫁衣襯著肌膚如雪绪钥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天关炼,我揣著相機(jī)與錄音程腹,去河邊找鬼。 笑死儒拂,一個(gè)胖子當(dāng)著我的面吹牛寸潦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播社痛,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼见转,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒜哀?” 一聲冷哼從身側(cè)響起斩箫,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撵儿,沒想到半個(gè)月后乘客,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淀歇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年易核,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房匆。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耸成,死狀恐怖报亩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情井氢,我是刑警寧澤弦追,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站花竞,受9級(jí)特大地震影響劲件,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜约急,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一零远、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厌蔽,春花似錦牵辣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戴卜,卻和暖如春逾条,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背投剥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工师脂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人江锨。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓吃警,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泳桦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汤徽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容