最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中讓多個cell上都出現(xiàn)倒計時的分析與實現(xiàn)

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

前言

以前就有人問過這樣一個問題:如果一個tableView的很多或者所有cell上都顯示一個倒計時,該怎么實現(xiàn)? 今天自己恰好也遇到了這樣的需求:很多產(chǎn)品,每個都有一個時限,在時限內才可以申購,過了申購功能就會關閉.簡單描述就是,每個cell上有個倒計時,時間結束與否,點擊cell響應的事件是不一樣的.那么怎么實現(xiàn)呢?下面談談自己的思考過程.

1.Cell內部加一個定時器

既然每個cell都有一個倒計時,時間還可能不一樣.根據(jù)"高內聚,低耦合"的思想,我首先想著直接讓cell自己來實現(xiàn)倒計時功能:每個cell添加一個NSTimer,沒隔1秒,讓其顯示的時間減少一秒.

- (void)timeChange {
 self.totalSeconds --;
 if (self.totalSeconds < 0) {
   self.timerLabel.text = @"倒計時結束";
  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:@"%@天:%@時:%@分:%@秒",day,hour,minite,second];
}

乍看,好像一切都OK,但是當我們拖動cell時,會發(fā)現(xiàn)一旦cell移除屏幕,再拖回來的時候,又會重頭倒計時.當然,這和我在setDataDict:方法中的賦值方式有關,可以通過totalSeconds這個屬性,保存當前剩余的時間,下一次再進來的時候,去取保存好的值.

- (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];
 }
}

這樣做,會發(fā)現(xiàn)當cell移除屏幕,再移回來的時候,不再是從頭倒計時,但是多拖動幾次又會發(fā)現(xiàn)新的問題:顯示錯亂,某個cell出現(xiàn)在了不該出現(xiàn)的位置.

仔細分析不難發(fā)現(xiàn),cell的復用機制是引起上述現(xiàn)象的"罪魁禍首",要解決這個問題,可以讓cell不復用,比方說,可以給每個cell綁定不同的標識,達到不復用的目的,看到這里,如果你也是這么想的,那么最好打住,因為為了達到這個目的,而讓cell不復用,以犧牲內存占用為代價,無疑是飲鴆止渴,丟了西瓜,撿個芝麻.

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

2. 在tableView的parentView中實現(xiàn)

既然在cell中實現(xiàn)遇到的坑比較多,那么又想著在外面做.這樣有一個明顯的好處,就是只需要一個定時器.每次觸發(fā),讓每個cell上顯示的時間遞減.由于tableView的顯示,取決于傳入的數(shù)據(jù),只要我在傳入數(shù)據(jù)之前把需要傳的數(shù)據(jù)處理好,這樣就不會因為cell的復用機制而帶來顯示錯亂的問題.運行代碼,發(fā)現(xiàn)問題圓滿解決!

/**定時器觸發(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. 值得注意的幾個地方

當我們拖動cell時,如果發(fā)現(xiàn)定時器不工作,可以用如下方式解決.

 _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
   [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode];

關于數(shù)據(jù)的傳入:

  • 直接提供產(chǎn)品到目前為止還剩多少時間.每個產(chǎn)品對應一個總的時間,用于倒計時.那么,后臺給我提供時間時就可以把每個產(chǎn)品對應的總時間返給我們.但是,這樣就要求后臺自己實時去計算每個產(chǎn)品在我們請求數(shù)據(jù)時還剩多少時間.
  • 后臺把每種產(chǎn)品的截止時間和當前的系統(tǒng)時間返給我們.系統(tǒng)時間,我們可用于矯正自己的系統(tǒng)時間(APP顯示的時間是可以人為修改的,并且不通設備之間,iOS與Android之間的時間有可能存在差異,為了統(tǒng)一所以需要矯正),通過矯正好的時間和截止時間,我們就能知道,該產(chǎn)品還剩多少時間.

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

總結

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 模仿iOS版微信的滑動View效果

    模仿iOS版微信的滑動View效果

    比如我們常用的微信,對于Android版本,長按某個聊天好友,會彈出 標為未讀,置頂聊天,刪除聊天 選項;對于iOS的版本,右滑,會顯示出 標為未讀,刪除 選項。這篇文章主要介紹了模仿iOS版微信的滑動View,需要的朋友可以參考下
    2019-05-05
  • iOS中UIAlertView警告框組件的使用教程

    iOS中UIAlertView警告框組件的使用教程

    需要注意的是在IOS8之后,UIAlertView和UIActionSheet這兩個控件被UIAlertController代替,但是這兩個控件依然可以使,下面我們就簡單了解一下iOS中UIAlertView警告框組件的使用教程
    2016-05-05
  • SIGPIPE(Signal?13,?Code?0)?異常排查及處理

    SIGPIPE(Signal?13,?Code?0)?異常排查及處理

    這篇文章主要為大家介紹了SIGPIPE(Signal?13,?Code?0)?異常排查原因解析及處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • iOS Label隨字自動變大效果

    iOS Label隨字自動變大效果

    這篇文章主要為大家詳細介紹了iOS Label隨字自動變大效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 基于iOS開發(fā)證書和配置文件的使用

    基于iOS開發(fā)證書和配置文件的使用

    下面小編就為大家分享一篇基于iOS開發(fā)證書和配置文件的使用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS開發(fā)添加新手引導效果

    iOS開發(fā)添加新手引導效果

    這篇文章主要介紹了iOS開發(fā)添加新手引導效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • iOS開發(fā)一個好看的ActionSheet

    iOS開發(fā)一個好看的ActionSheet

    本篇文章通過代碼分享和圖文形式教給大家用IOS寫一個好看的ActionSheet過程以及注意事項,需要的朋友參考下吧。
    2018-01-01
  • iOS字體抖動動畫的實現(xiàn)代碼

    iOS字體抖動動畫的實現(xiàn)代碼

    這篇文章主要介紹了iOS字體抖動動畫的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • iOS使用UICountingLabel實現(xiàn)數(shù)字變化的動畫效果

    iOS使用UICountingLabel實現(xiàn)數(shù)字變化的動畫效果

    本文主要介紹了iOS使用UICountingLabel實現(xiàn)數(shù)字變化動畫效果的方法,具有一定的參考價值,下面跟著小編一起來看下吧
    2016-12-12
  • 談談制作iOS Ad-Hoc測試應用

    談談制作iOS Ad-Hoc測試應用

    這篇文章主要介紹了談談制作iOS Ad-Hoc測試應用,AD-HOC測試是指隨機測試,這種測試的特點是無特定的測試用例,有興趣的可以了解一下。
    2016-12-12

最新評論

巴东县| 台南县| 松潘县| 通海县| 凤台县| 新宁县| 台北市| 郯城县| 庆阳市| 罗城| 凤翔县| 舞阳县| 岑溪市| 芜湖县| 鹤山市| 南漳县| 广东省| 怀仁县| 岱山县| 曲沃县| 正镶白旗| 江津市| 汝城县| 安图县| 塘沽区| 三穗县| 西乌| 贡嘎县| 花莲县| 新源县| 蓬安县| 麟游县| 临湘市| 文成县| 景谷| 阿巴嘎旗| 丹阳市| 旺苍县| 福安市| 浏阳市| 且末县|