欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS中讓多個(gè)cell上都出現(xiàn)倒計(jì)時(shí)的分析與實(shí)現(xiàn)

 更新時(shí)間:2017年07月04日 16:01:10   作者:鯤鵬DP  
這篇文章主要給大家介紹了在iOS中每個(gè)cell上都出現(xiàn)倒計(jì)時(shí)的分析與實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。

前言

以前就有人問(wèn)過(guò)這樣一個(gè)問(wèn)題:如果一個(gè)tableView的很多或者所有cell上都顯示一個(gè)倒計(jì)時(shí),該怎么實(shí)現(xiàn)? 今天自己恰好也遇到了這樣的需求:很多產(chǎn)品,每個(gè)都有一個(gè)時(shí)限,在時(shí)限內(nèi)才可以申購(gòu),過(guò)了申購(gòu)功能就會(huì)關(guān)閉.簡(jiǎn)單描述就是,每個(gè)cell上有個(gè)倒計(jì)時(shí),時(shí)間結(jié)束與否,點(diǎn)擊cell響應(yīng)的事件是不一樣的.那么怎么實(shí)現(xiàn)呢?下面談?wù)勛约旱乃伎歼^(guò)程.

1.Cell內(nèi)部加一個(gè)定時(shí)器

既然每個(gè)cell都有一個(gè)倒計(jì)時(shí),時(shí)間還可能不一樣.根據(jù)"高內(nèi)聚,低耦合"的思想,我首先想著直接讓cell自己來(lái)實(shí)現(xiàn)倒計(jì)時(shí)功能:每個(gè)cell添加一個(gè)NSTimer,沒(méi)隔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移除屏幕,再拖回來(lái)的時(shí)候,又會(huì)重頭倒計(jì)時(shí).當(dāng)然,這和我在setDataDict:方法中的賦值方式有關(guān),可以通過(guò)totalSeconds這個(gè)屬性,保存當(dāng)前剩余的時(shí)間,下一次再進(jìn)來(lái)的時(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移除屏幕,再移回來(lái)的時(shí)候,不再是從頭倒計(jì)時(shí),但是多拖動(dòng)幾次又會(huì)發(fā)現(xiàn)新的問(wèn)題:顯示錯(cuò)亂,某個(gè)cell出現(xiàn)在了不該出現(xiàn)的位置.

仔細(xì)分析不難發(fā)現(xiàn),cell的復(fù)用機(jī)制是引起上述現(xiàn)象的"罪魁禍?zhǔn)?,要解決這個(gè)問(wèn)題,可以讓cell不復(fù)用,比方說(shuō),可以給每個(gè)cell綁定不同的標(biāo)識(shí),達(dá)到不復(fù)用的目的,看到這里,如果你也是這么想的,那么最好打住,因?yàn)闉榱诉_(dá)到這個(gè)目的,而讓cell不復(fù)用,以犧牲內(nèi)存占用為代價(jià),無(wú)疑是飲鴆止渴,丟了西瓜,撿個(gè)芝麻.

值得的注意的是,如果在cell中實(shí)現(xiàn),每個(gè)cell都添加一個(gè)定時(shí)器,這也是一筆可觀的開(kāi)銷(xiāo).

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ī)制而帶來(lái)顯示錯(cuò)亂的問(wèn)題.運(yùn)行代碼,發(fā)現(xiàn)問(wè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)品對(duì)應(yīng)一個(gè)總的時(shí)間,用于倒計(jì)時(shí).那么,后臺(tái)給我提供時(shí)間時(shí)就可以把每個(gè)產(chǎn)品對(duì)應(yīng)的總時(shí)間返給我們.但是,這樣就要求后臺(tái)自己實(shí)時(shí)去計(jì)算每個(gè)產(chǎn)品在我們請(qǐng)求數(shù)據(jù)時(shí)還剩多少時(shí)間.
  • 后臺(tái)把每種產(chǎn)品的截止時(shí)間和當(dāng)前的系統(tǒng)時(shí)間返給我們.系統(tǒng)時(shí)間,我們可用于矯正自己的系統(tǒng)時(shí)間(APP顯示的時(shí)間是可以人為修改的,并且不通設(shè)備之間,iOS與Android之間的時(shí)間有可能存在差異,為了統(tǒng)一所以需要矯正),通過(guò)矯正好的時(shí)間和截止時(shí)間,我們就能知道,該產(chǎn)品還剩多少時(shí)間.

雖然,我這邊自己用的第一種方式寫(xiě)的Demo,但是,相比之下,我更加傾向于第二種數(shù)據(jù)的傳遞方式,準(zhǔn)確性高,也能為后端同事剩些事.

總結(jié)

由于這只是一個(gè)最初的Demo,也只是一些個(gè)人的初步看法,難免有些疏漏,如有紕漏,還望指正.

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • IOS 開(kāi)發(fā)之應(yīng)用喚起實(shí)現(xiàn)原理詳解

    IOS 開(kāi)發(fā)之應(yīng)用喚起實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了IOS 開(kāi)發(fā)之應(yīng)用喚起實(shí)現(xiàn)原理詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • iOS將時(shí)間NSDate轉(zhuǎn)化為毫秒時(shí)間戳的方法示例

    iOS將時(shí)間NSDate轉(zhuǎn)化為毫秒時(shí)間戳的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS將時(shí)間NSDate轉(zhuǎn)化為毫秒時(shí)間戳的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • IOS 的彈性滾動(dòng)解決方案

    IOS 的彈性滾動(dòng)解決方案

    所謂彈性滾動(dòng)就是指在翻動(dòng)長(zhǎng)頁(yè)面手指離開(kāi)時(shí),由慢到塊,由快到慢的過(guò)度。這篇文章主要介紹了IOS 的彈性滾動(dòng)解決方案,需要的朋友可以參考下
    2016-10-10
  • iOS下Safari點(diǎn)擊事件失效的解決方法

    iOS下Safari點(diǎn)擊事件失效的解決方法

    這篇文章主要給大家介紹了關(guān)于在iOS下Safari點(diǎn)擊事件失效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • iOS 項(xiàng)目中的version和build 詳解

    iOS 項(xiàng)目中的version和build 詳解

    這篇文章主要介紹了iOS 項(xiàng)目中的version和build 詳解的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • iOS開(kāi)發(fā)常用線程安全鎖

    iOS開(kāi)發(fā)常用線程安全鎖

    這篇文章主要為大家介紹了iOS開(kāi)發(fā)常用線程安全鎖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • iOS利用攝像頭獲取環(huán)境光感參數(shù)的方法

    iOS利用攝像頭獲取環(huán)境光感參數(shù)的方法

    本篇文章主要介紹了iOS利用攝像頭獲取環(huán)境光感參數(shù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • iOS獲取某個(gè)日期后n個(gè)月的日期

    iOS獲取某個(gè)日期后n個(gè)月的日期

    這篇文章主要介紹了iOS獲取某個(gè)日期后n個(gè)月的日期的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 代碼詳解ios鍵盤(pán)收起問(wèn)題

    代碼詳解ios鍵盤(pán)收起問(wèn)題

    本篇文章針對(duì)IOS開(kāi)發(fā)時(shí)候的鍵盤(pán)收起問(wèn)題做了詳細(xì)分析和代碼說(shuō)明,有興趣的朋友參考下吧。
    2018-01-01
  • iOS開(kāi)發(fā)xconfig和script腳本使用詳解

    iOS開(kāi)發(fā)xconfig和script腳本使用詳解

    這篇文章主要為大家介紹了iOS開(kāi)發(fā)xconfig和script腳本使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論