iOS cell中的倒計(jì)時(shí)以及reloadData“失效”的情形

首先先簡(jiǎn)述一下此次reloadData()失效是基于一種怎樣的場(chǎng)景:

有A、B兩個(gè)頁(yè)面,A頁(yè)面是一個(gè)展示所有倒計(jì)時(shí)的列表頁(yè),B頁(yè)面是某個(gè)倒計(jì)時(shí)的詳情頁(yè),并且當(dāng)某個(gè)倒計(jì)時(shí)結(jié)束后間隔指定時(shí)間重新刷新該倒計(jì)時(shí),并同步到詳情頁(yè)B頁(yè)面。


CountDow.gif

關(guān)于cell倒計(jì)時(shí)的實(shí)現(xiàn)有興趣的小伙伴可以參考這篇文章,作者封裝了能夠?qū)崿F(xiàn)該功能的第三方庫(kù)以及對(duì)其實(shí)現(xiàn)思路也有詳細(xì)的講解,本篇提供的demo也是基于此第三方庫(kù)去實(shí)現(xiàn)的。

在需要倒計(jì)時(shí)的地方監(jiān)聽(tīng)通知OYCountDownNotification,在通知里處理倒計(jì)時(shí)文本的改變以及倒計(jì)時(shí)停止后通知控制器做重新獲取倒計(jì)時(shí)的操作。

@objc private func countDownNotification() {
            
        let intervalModel = OYCountDownManager.sharedManager.timeIntervalDict[self.model!.identifier]
        
        if intervalModel == nil {
            return
        }
        
        let timeInterval = OYCountDownManager.sharedManager.timeIntervalWithIdentifier(identifier: self.model!.identifier)

        let countDown = self.model!.interVal - timeInterval
        if countDown <= 0 { // 倒計(jì)時(shí)結(jié)束時(shí)回調(diào)
            
            countdownLabel.text = "開(kāi)獎(jiǎng)中"
            
            if self.delegate != nil {
                self.delegate?.countdownEnd(model: self.model!)
            }
        } else {
            countdownLabel.text = String(format: "%02d:%02d:%02d", countDown/3600, (countDown/60)%60, countDown%60)
        }
    }

獲取到新的倒計(jì)時(shí)信息之后刷新列表,并且把數(shù)據(jù)同步給詳情頁(yè)(如果詳情頁(yè)在當(dāng)前窗口中)

if WeakSelf!.detailVC != nil {                              
    WeakSelf!.detailVC?.updateVc(model: model)
}

之前是把上述同步數(shù)據(jù)的代碼寫在cellForRow(at:)里,每當(dāng)給cell賦值時(shí)再去判斷并同步數(shù)據(jù)。但是當(dāng)用戶停留在詳情頁(yè)時(shí),發(fā)現(xiàn)詳情頁(yè)的數(shù)據(jù)并沒(méi)有被更新。祭出斷點(diǎn)調(diào)試技能后發(fā)現(xiàn),執(zhí)行了reloadData程序僅執(zhí)行了tableView(_:numberOfRowsInSection:)方法,而做同步數(shù)據(jù)的方法cellForRow(at:)并沒(méi)有被執(zhí)行。

小朋友,你是否有很多問(wèn)號(hào),明明numberOfRowsInSection都已調(diào)用了,為什么cellForRowAt卻不執(zhí)行?

可能有些老司機(jī)們已經(jīng)發(fā)現(xiàn)了問(wèn)題是出在哪里,問(wèn)題就出在cellForRow(at:)。看下蘋果官網(wǎng)文檔對(duì)于該方法的解釋

cellForRow

簡(jiǎn)言之就是該方法所在的視圖存在于活動(dòng)窗口中cellForRow(at:)才會(huì)被執(zhí)行。而此時(shí)用戶停留在了詳情頁(yè),但是cellForRow(at:)存在于A頁(yè)面中,所以數(shù)據(jù)沒(méi)有同步到B頁(yè)面。

而且cellForRow(at:)可能會(huì)執(zhí)行多次,所以把同步數(shù)據(jù)的代碼寫在該方法中也存在一定的合理性。

最后別忘了在適當(dāng)?shù)牡胤结尫拍銊?chuàng)建的定時(shí)器!

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 場(chǎng)景是這樣的: APP首頁(yè)是一個(gè)UITableView列表,數(shù)據(jù)源設(shè)置為全局變量dataList,點(diǎn)擊則跳轉(zhuǎn)第2頁(yè)...
    藍(lán)色小石頭閱讀 9,159評(píng)論 2 10
  • 怎么愛(ài)父母?故作堅(jiān)強(qiáng)?像他們養(yǎng)育我一樣?把所有遺忘的拾起?把丟失的愛(ài)拾起?把錯(cuò)過(guò)的機(jī)會(huì)拾起?怎么愛(ài)父母?怎么得到答...
    不俗小七閱讀 441評(píng)論 3 11
  • 幾近頹廢的生活 該不該繼續(xù) 吃睡吃 住過(guò)的都比你自在
    courage9869閱讀 295評(píng)論 0 0
  • if(@available(iOS11.0, *)) { self.homeTableView.cont...
    小專注閱讀 418評(píng)論 0 0
  • 放假第四天,跟往年一樣,沒(méi)有什么新鮮的事情。在這個(gè)時(shí)候,我還在想著自己應(yīng)該做一些什么事情讓自己以后的生活不要那...
    西塔塔閱讀 179評(píng)論 0 2