UICollectionView的cellForItem(at: IndexPath)方法

首先西潘,需求是做一個(gè)選擇顏色的小組件。如下圖所示


效果圖

需要滑動(dòng)展示哨颂,8種顏色喷市,一頁(yè)顯示4個(gè),共兩頁(yè)威恼。
我選擇了UICollectionView來(lái)做品姓。因?yàn)轭伾珗D片是直接用Graphics畫的,就直接把繪制出來(lái)的CGImage賦值給了UICollectionViewCell的contentView.layer.contents屬性箫措。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: UICollectionViewCell.reuseIdentifier, for: indexPath)
    let colorType = viewModel!.colors[indexPath.section][indexPath.item]
    if colorType == viewModel!.selectedColor {
        cell.contentView.layer.contents = cgImage(for: .selected, colorType: colorType)
    }else {
        cell.contentView.layer.contents = cgImage(for: .normal, colorType: colorType)
    }
    return cell
}

主要的代理方法如下:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.contentView.layer.contents = cgImage(for: .selected,
                                               colorType: viewModel!.colors[indexPath.section][indexPath.item])
    viewModel!.selectedColor = viewModel!.colors[indexPath.section][indexPath.item]
}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.contentView.layer.contents = cgImage(for: .normal,
                                               colorType: viewModel!.colors[indexPath.section][indexPath.item])
}

看上去很完美腹备,我也是這么認(rèn)為的〗锫可當(dāng)我愉快的選來(lái)選去的時(shí)候植酥,出現(xiàn)了這種情況:

選中第二頁(yè)的第一個(gè),再選擇上一頁(yè)的任意一個(gè)弦牡,第二頁(yè)那個(gè)被選中的狀態(tài)不改變

我第一反應(yīng)是惧互,難道didDeselect方法沒(méi)有執(zhí)行?經(jīng)過(guò)斷點(diǎn)發(fā)現(xiàn)喇伯,這個(gè)方法是執(zhí)行了,indexPath也是正確傳遞了上一次被選中cell的位置拨与。但是在didDeselect方法中使用collectionView.cellForItem(at: indexPath)得到的結(jié)果是nil稻据。

出現(xiàn)不知道的問(wèn)題了怎么辦?看文檔买喧。
cellForItem(at:)的官方說(shuō)明是 "Returns the visible cell object at the specified index path."

好吧捻悯,我承認(rèn)我的基礎(chǔ)知識(shí)很爛。我是個(gè)智障淤毛。今缚。。
因?yàn)榧弦晥D會(huì)創(chuàng)建最大可見(jiàn)cell數(shù) maxVisibled+1個(gè)cell低淡,滑動(dòng)中姓言,超出這個(gè)范圍的cell會(huì)被放進(jìn)緩沖區(qū)瞬项,即將出現(xiàn)的第maxVisibled+2個(gè)cell才會(huì)調(diào)用cellForItemAt indexPath:方法獲取,可能從緩沖池取何荚,可能重新創(chuàng)建(緩沖池里沒(méi)有可復(fù)用的cell時(shí))囱淋。但是本例中 [1, 0] 和 [0, 3] 這兩個(gè)位置的cell很尷尬,因?yàn)樗鼈冇肋h(yuǎn)不會(huì)被放進(jìn)緩沖區(qū)餐塘,不會(huì)被重新獲取妥衣,狀態(tài)就不會(huì)被重置。cellForItem(at: indexPath) 又無(wú)法取到不可見(jiàn)的cell戒傻,所以它們一旦被選中就無(wú)法取消了(除非在本頁(yè)中再次選中它税手,再在本頁(yè)中選中其他cell)。解決辦法也很簡(jiǎn)單需纳,增加一個(gè)變量持有被選中的cell來(lái)維護(hù)是否選中狀態(tài)就行了芦倒。
不說(shuō)了,我看文檔去了候齿。熙暴。。

好吧慌盯,我又回來(lái)了周霉。。亚皂。
我發(fā)現(xiàn)壓根不用這么麻煩俱箱。。直接重寫UICollectionViewCell的 isSelected 屬性的didSet方法灭必,在這個(gè)方法里更換圖片就行了狞谱。。禁漓。因?yàn)檫@里的UICollectionView的allowsMultipleSelection是false跟衅,并不允許多選,所以選擇其他cell時(shí)播歼,會(huì)自動(dòng)取消上一個(gè)被選中cell的選中狀態(tài)伶跷。。秘狞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叭莫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烁试,更是在濱河造成了極大的恐慌雇初,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件减响,死亡現(xiàn)場(chǎng)離奇詭異靖诗,居然都是意外死亡郭怪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門呻畸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)移盆,“玉大人,你說(shuō)我怎么就攤上這事伤为≈溲” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绞愚,是天一觀的道長(zhǎng)叙甸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)位衩,這世上最難降的妖魔是什么裆蒸? 我笑而不...
    開(kāi)封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮糖驴,結(jié)果婚禮上僚祷,老公的妹妹穿的比我還像新娘。我一直安慰自己贮缕,他們只是感情好辙谜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著感昼,像睡著了一般装哆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上定嗓,一...
    開(kāi)封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天蜕琴,我揣著相機(jī)與錄音,去河邊找鬼宵溅。 笑死凌简,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼玩荠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起铅碍,我...
    開(kāi)封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤润绵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胞谈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尘盼,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憨愉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卿捎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配紫。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖午阵,靈堂內(nèi)的尸體忽然破棺而出躺孝,到底是詐尸還是另有隱情,我是刑警寧澤底桂,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布植袍,位于F島的核電站,受9級(jí)特大地震影響籽懦,放射性物質(zhì)發(fā)生泄漏于个。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一暮顺、第九天 我趴在偏房一處隱蔽的房頂上張望厅篓。 院中可真熱鬧,春花似錦捶码、人聲如沸羽氮。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乏苦。三九已至,卻和暖如春尤筐,著一層夾襖步出監(jiān)牢的瞬間汇荐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工盆繁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掀淘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓油昂,卻偏偏與公主長(zhǎng)得像革娄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冕碟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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