亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS中讓多個cell上都出現倒計時的分析與實現

2020-07-26 02:46:10
字體:
來源:轉載
供稿:網友

前言

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

1.Cell內部加一個定時器

既然每個cell都有一個倒計時,時間還可能不一樣.根據"高內聚,低耦合"的思想,我首先想著直接讓cell自己來實現倒計時功能:每個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時,會發現一旦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]; }}

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

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

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

2. 在tableView的parentView中實現

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

/**定時器觸發*/- (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時,如果發現定時器不工作,可以用如下方式解決.

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

關于數據的傳入:

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

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

總結

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人福利网站在线观看| 欧美国产日韩一区二区| 欧美专区国产专区| 成人激情视频免费在线| 亚洲国产精品小视频| 欧美激情视频三区| 精品亚洲一区二区三区四区五区| 久久久之久亚州精品露出| 久久久久免费精品国产| 亲爱的老师9免费观看全集电视剧| 欧美在线国产精品| 欧美夫妻性生活xx| 亚洲自拍偷拍区| 色哟哟网站入口亚洲精品| 亚洲性生活视频在线观看| 亚洲男人天堂2019| 国产91精品久久久久| 亚洲福利视频二区| 亚洲天堂成人在线| 国产精品男女猛烈高潮激情| 国产精品极品尤物在线观看| 色诱女教师一区二区三区| 国模视频一区二区| 亚洲女人天堂色在线7777| 国内精品400部情侣激情| 狠狠躁夜夜躁人人躁婷婷91| 国产精品91久久久久久| 欧美最猛性xxxxx亚洲精品| 中文字幕日韩欧美| 国产一区二区三区直播精品电影| 久久久国产精品免费| 日韩av观看网址| 黑人巨大精品欧美一区免费视频| 国产激情综合五月久久| 欧美性猛交xxxx乱大交极品| 日韩精品小视频| 国产欧美在线播放| 亚洲成人黄色在线| 亚洲一区二区三区久久| 久久精品视频免费播放| 精品视频在线播放免| 国产精品网红福利| 国产精品爽黄69| 黑人精品xxx一区一二区| 91超碰中文字幕久久精品| 国产精品美腿一区在线看| 国产一区二区三区久久精品| 久久免费精品日本久久中文字幕| 91久久久久久久久久久久久| 国产区精品视频| 日韩精品免费一线在线观看| 欧美日韩成人黄色| 亚洲国产精品推荐| 欧美怡春院一区二区三区| 丝袜亚洲欧美日韩综合| 亚洲欧美日韩精品久久亚洲区| 国产精品视频久久久| 51视频国产精品一区二区| 91日韩在线视频| 亚洲a中文字幕| 久久伊人精品天天| 亚洲精品乱码久久久久久金桔影视| 亚洲国产精品免费| 懂色aⅴ精品一区二区三区蜜月| 中文字幕日本欧美| 国内偷自视频区视频综合| 中文字幕亚洲无线码在线一区| 欧美一级黑人aaaaaaa做受| 日本免费久久高清视频| 国模精品一区二区三区色天香| 欧美又大又硬又粗bbbbb| 亚洲区在线播放| 精品美女国产在线| 这里只有精品在线播放| 欧美一级片久久久久久久| 国产中文字幕日韩| 日韩国产中文字幕| 国产视频999| 国产成人精品午夜| 国产成人97精品免费看片| 国产91在线视频| 日韩精品中文字幕久久臀| 青草成人免费视频| 欧美老女人xx| 亚洲综合国产精品| 91国产精品视频在线| 色老头一区二区三区| 8x拔播拔播x8国产精品| 国语自产在线不卡| 日韩在线视频线视频免费网站| 亚洲激情久久久| 亚洲综合社区网| 俺也去精品视频在线观看| 久久国产精品久久久久久久久久| 欧美性猛交丰臀xxxxx网站| 青青青国产精品一区二区| 日韩天堂在线视频| 亚洲精品第一国产综合精品| 97在线视频精品| www欧美xxxx| 欧美激情啊啊啊| 日韩美女免费线视频| 色偷偷91综合久久噜噜| 亚洲男人天堂网| 久久久精品在线| 日韩av在线网| 中文综合在线观看| 亚洲精品国产精品国自产观看浪潮| 日韩va亚洲va欧洲va国产| 97热在线精品视频在线观看| 亚洲国产成人在线播放| 欧美精品在线网站| 在线视频免费一区二区| 欧美激情中文网| 日韩午夜在线视频| 欧美成人精品三级在线观看| 国产精品jvid在线观看蜜臀| 国产精品嫩草影院久久久| 久久久久久久久久国产| 91精品久久久久久久久青青| 国产成人精品亚洲精品| 国产精品亚洲片夜色在线| 成人黄色免费片| 久久精品一偷一偷国产| 久久久国产视频| 欧美丝袜美女中出在线| 亚洲国产精品99久久| 黄色成人在线免费| 日韩中文字幕免费视频| 欧美国产日韩一区二区在线观看| 操91在线视频| 992tv成人免费视频| 欧美日韩国产精品一区二区不卡中文| 狠狠躁夜夜躁人人躁婷婷91| 成人免费看片视频| 欧美极品美女视频网站在线观看免费| 亚洲激情视频在线播放| 国产主播欧美精品| 久久这里只有精品99| 成人福利在线视频| 亚洲精品av在线播放| 在线日韩精品视频| 成人有码在线播放| 中文字幕欧美在线| 国产日本欧美视频| 欧美日韩加勒比精品一区| 国产精品视频免费在线观看| 亚洲福利小视频| 中文字幕不卡在线视频极品| 久久99亚洲精品| 久久精品视频在线播放| 久99九色视频在线观看| 亚洲欧美中文日韩在线| 91精品国产乱码久久久久久蜜臀| 中文字幕日韩精品在线| 欧美国产精品人人做人人爱| 欧美日韩国产限制| 成人免费观看49www在线观看| 精品国产一区二区在线| 热re99久久精品国产66热| 精品国产91久久久久久老师| 亚洲国产欧美在线成人app| 亚洲色图第三页| 欧美精品激情在线观看|