這篇文章將為大家詳細(xì)講解有關(guān)iOS中如何讓多個(gè)cell上都出現(xiàn)倒計(jì)時(shí),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,成都微信小程序,網(wǎng)頁設(shè)計(jì)制作,移動(dòng)網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長。
1.Cell內(nèi)部加一個(gè)定時(shí)器
既然每個(gè)cell都有一個(gè)倒計(jì)時(shí),時(shí)間還可能不一樣.根據(jù)"高內(nèi)聚,低耦合"的思想,我首先想著直接讓cell自己來實(shí)現(xiàn)倒計(jì)時(shí)功能:每個(gè)cell添加一個(gè)NSTimer,沒隔1秒,讓其顯示的時(shí)間減少一秒.
- (void)timeChange { self.totalSeconds --; if (self.totalSeconds < 0) { self.timerLabel.text = @"倒計(jì)時(shí)結(jié)束"; return; } self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds]; } - (void)setDataDict:(NSDictionary *)dataDict { _dataDict = dataDict; NSString *totalTime = dataDict[@"totalTime"]; self.totalSeconds = totalTime.integerValue; self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds]; if (!_timer) { _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode]; } } - (NSString*)timeChangeWithSeconds:(NSInteger)seconds { NSInteger temp1 = seconds/60; NSInteger temp2 = temp1/ 60; NSInteger d = temp2 / 24; NSInteger h = temp2 % 24; NSInteger m = temp1 % 60; NSInteger s = seconds %60; NSString * hour = h< 9 ? [NSString stringWithFormat:@"0%ld",(long)h] :[NSString stringWithFormat:@"%ld",(long)h]; NSString *day = d < 9 ? [NSString stringWithFormat:@"0%ld",(long)d] : [NSString stringWithFormat:@"%ld",(long)d]; NSString *minite = m < 9 ? [NSString stringWithFormat:@"0%ld",(long)m] : [NSString stringWithFormat:@"%ld",(long)m]; NSString *second = s < 9 ? [NSString stringWithFormat:@"0%ld",(long)s] : [NSString stringWithFormat:@"%ld",(long)s]; return [NSString stringWithFormat:@"%@天:%@時(shí):%@分:%@秒",day,hour,minite,second]; }
乍看,好像一切都OK,但是當(dāng)我們拖動(dòng)cell時(shí),會(huì)發(fā)現(xiàn)一旦cell移除屏幕,再拖回來的時(shí)候,又會(huì)重頭倒計(jì)時(shí).當(dāng)然,這和我在setDataDict:方法中的賦值方式有關(guān),可以通過totalSeconds這個(gè)屬性,保存當(dāng)前剩余的時(shí)間,下一次再進(jìn)來的時(shí)候,去取保存好的值.
- (void)setDataDict:(NSDictionary *)dataDict { _dataDict = dataDict; if (self.totalSeconds !=0) { self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds]; }else { NSString *totalTime = dataDict[@"totalTime"]; self.totalSeconds = totalTime.integerValue; self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds]; } if (!_timer) { _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode]; } }
這樣做,會(huì)發(fā)現(xiàn)當(dāng)cell移除屏幕,再移回來的時(shí)候,不再是從頭倒計(jì)時(shí),但是多拖動(dòng)幾次又會(huì)發(fā)現(xiàn)新的問題:顯示錯(cuò)亂,某個(gè)cell出現(xiàn)在了不該出現(xiàn)的位置.
仔細(xì)分析不難發(fā)現(xiàn),cell的復(fù)用機(jī)制是引起上述現(xiàn)象的"罪魁禍?zhǔn)?,要解決這個(gè)問題,可以讓cell不復(fù)用,比方說,可以給每個(gè)cell綁定不同的標(biāo)識,達(dá)到不復(fù)用的目的,看到這里,如果你也是這么想的,那么最好打住,因?yàn)闉榱诉_(dá)到這個(gè)目的,而讓cell不復(fù)用,以犧牲內(nèi)存占用為代價(jià),無疑是飲鴆止渴,丟了西瓜,撿個(gè)芝麻.
值得的注意的是,如果在cell中實(shí)現(xiàn),每個(gè)cell都添加一個(gè)定時(shí)器,這也是一筆可觀的開銷.
2. 在tableView的parentView中實(shí)現(xiàn)
既然在cell中實(shí)現(xiàn)遇到的坑比較多,那么又想著在外面做.這樣有一個(gè)明顯的好處,就是只需要一個(gè)定時(shí)器.每次觸發(fā),讓每個(gè)cell上顯示的時(shí)間遞減.由于tableView的顯示,取決于傳入的數(shù)據(jù),只要我在傳入數(shù)據(jù)之前把需要傳的數(shù)據(jù)處理好,這樣就不會(huì)因?yàn)閏ell的復(fù)用機(jī)制而帶來顯示錯(cuò)亂的問題.運(yùn)行代碼,發(fā)現(xiàn)問題圓滿解決!
/**定時(shí)器觸發(fā)*/ - (void)timeChange { NSMutableArray *tempArrM = [NSMutableArray array]; for (NSDictionary *dict in self.dataArr) { NSString *totalTime = dict[@"totalTime"]; if ([totalTime isEqualToString:@"0"]) { totalTime = @"0"; }else { totalTime = [NSString stringWithFormat:@"%ld",totalTime.integerValue -1]; } [tempArrM addObject:@{@"totalTime":totalTime}]; } self.dataArr = tempArrM; [self.pageTableView reloadData]; }
3. 值得注意的幾個(gè)地方
當(dāng)我們拖動(dòng)cell時(shí),如果發(fā)現(xiàn)定時(shí)器不工作,可以用如下方式解決.
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode];
關(guān)于數(shù)據(jù)的傳入:
直接提供產(chǎn)品到目前為止還剩多少時(shí)間.每個(gè)產(chǎn)品對應(yīng)一個(gè)總的時(shí)間,用于倒計(jì)時(shí).那么,后臺給我提供時(shí)間時(shí)就可以把每個(gè)產(chǎn)品對應(yīng)的總時(shí)間返給我們.但是,這樣就要求后臺自己實(shí)時(shí)去計(jì)算每個(gè)產(chǎn)品在我們請求數(shù)據(jù)時(shí)還剩多少時(shí)間.
后臺把每種產(chǎn)品的截止時(shí)間和當(dāng)前的系統(tǒng)時(shí)間返給我們.系統(tǒng)時(shí)間,我們可用于矯正自己的系統(tǒng)時(shí)間(APP顯示的時(shí)間是可以人為修改的,并且不通設(shè)備之間,iOS與Android之間的時(shí)間有可能存在差異,為了統(tǒng)一所以需要矯正),通過矯正好的時(shí)間和截止時(shí)間,我們就能知道,該產(chǎn)品還剩多少時(shí)間.
雖然,我這邊自己用的第一種方式寫的Demo,但是,相比之下,我更加傾向于第二種數(shù)據(jù)的傳遞方式,準(zhǔn)確性高,也能為后端同事剩些事.
關(guān)于“iOS中如何讓多個(gè)cell上都出現(xiàn)倒計(jì)時(shí)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。