iOS 在cell中使用倒計時的處理方法 新

2022-08-12 07:51:11 字數 3622 閱讀 4110

之前的文章ios 在cell中使用倒計時的處理方法得到大量的支援, 在這先感謝大家的支援. 但是也收到不少人的回覆表示不會用, 需要一一解答, 由於之前寫的時候沒有使用markdown編輯, 所以現在沒法更新之前的文章, 重新寫乙份清晰的文章

oycountdownmanager-swift v2.0

原理分析圖.png

單個列表倒計時.gif

* 多個列表倒計時

* 多個頁面倒計時

* 分頁列表倒計時

* 後台模式倒計時

多個列表倒計時.gif

多個頁面倒計時.gif

分頁列表倒計時.gif

1.1 第一種方法: 使用cocoapods自動安裝

pod '

oycountdownmanager

'

1.2 第二種方法

2. 在第一次使用的地方呼叫[kcountdownmanager start]

- (void

)viewdidload

3. 在cell初始化中監聽通知 kcountdownnotification

- (instancetype)initwithstyle:(uitableviewcellstyle)style reuseidentifier:(nsstring *)reuseidentifier 

return

self;

}

4. 在cell設定通知**, 取得時間差, 根據時間差進行處理

- (void

)countdownnotification

return

;

///重新賦值

self.timelabel.text = [nsstring stringwithformat:@"

倒計時%02zd:%02zd:%02zd

", countdown/3600, (countdown/60)%60, countdown%60

];}

5. 當重新整理資料時,呼叫reload方法

- (void

)reloaddata

6. 當不需要倒計時時, 廢除定時器

[kcountdownmanager invalidate];
增加identifier:識別符號, 乙個identifier支援乙個倒計時源, 有乙個單獨的時間差

/*

* 新增倒計時源

*/- (void)addsourcewithidentifier:(nsstring *)identifier;

/** 獲取時間差

*/- (nsinteger)timeintervalwithidentifier:(nsstring *)identifier;

/** 重新整理倒計時源

*/- (void)reloadsourcewithidentifier:(nsstring *)identifier;

/** 重新整理所有倒計時源

*/- (void

)reloadallsource;

/** 清除倒計時源

*/- (void)removesourcewithidentifier:(nsstring *)identifier;

/** 清除所有倒計時源

*/- (void)removeallsource;

以乙個頁面有兩個獨立的列表為例

1.定義identifier(常量)

nsstring *const oymultipletablesource1 = @"

oymultipletablesource1";

nsstring *const oymultipletablesource2 = @"

oymultipletablesource2

";

2.增加倒計時源

//

增加倒計時源

[kcountdownmanager addsourcewithidentifier:oymultipletablesource1];

[kcountdownmanager addsourcewithidentifier:oymultipletablesource2];

3.在cell通知**中, 通過identifier取得時間差, 根據時間差進行處理

- (void

)countdownnotification

///計算倒計時

oymodel *model =self.model;

///根據identifier取得時間差, 以oymultipletablesource1為例

nsinteger timeinterval = timeinterval =[kcountdownmanager timeintervalwithidentifier: oymultipletablesource1];

}nsinteger countdown = model.count -timeinterval;

///當倒計時到了進行**

if (countdown <= 0

)

///重新賦值

self.detailtextlabel.text = [nsstring stringwithformat:@"

倒計時%02zd:%02zd:%02zd

", countdown/3600, (countdown/60)%60, countdown%60

];}

4. 當重新整理資料時,呼叫reloadsourcewithidentifier:重新整理時間差

- (void

)reloaddata

5. 當頁面銷毀, 移除倒計時源, 或者不需要定時器, 廢除定時器

- (void

)reloaddata

誤差分析
滾動cell時出去文字閃爍
在給cell的模型賦值後, 最好手動呼叫一下countdownnotification方法, 保證及時重新整理

///

重寫setter方法

- (void)setmodel:(model *)model

倒計時為0後出現復用問題
在倒計時為0後, 應該**給控制器, 從後台請求一次資料, 保證倒計時沒有出現誤差

if (countdown <= 0

) return;

出現每秒倒計時減2的問題
1.檢視定時器設定是否正確, 或者通知是否監聽了兩次

2.在countdownnotification方法中, 是否用[nsdate date]做了某些計算, 因為[nsdate date]為當前時間, 每一秒去取都會比上一秒大一秒, 再加上timeinterval也是一秒加一, 那麼就會出現每秒倒計時減2的問題

如果還有不懂的問題, 或者出現其它bug

請檢視demo: demo

iOS每個Cell倒計時

實現原理 1 將資料 資料中的時間部分 以字典 字典中包括 記錄所存資料下標,還有所剩時間 兩個 key 的形式儲存到陣列中。2 開啟定時器,執行 遍歷整個陣列,每秒減 一,然後儲存到他原來的位置。3 每次減一之後,根據之前記錄的下標 viewcontroller.m countdowndemo c...

iOS 倒計時按鈕

1 新建乙個類,取名為 timerbtn,繼承uibutton 2 在timer.h中新增如下 import inte ce timerbtn uibutton 建立倒計時按鈕 param frame 位置大小 param title 標題 param ntimer 倒計時時間 return 倒計時...

iOS倒計時動畫

效果圖 製作成gif之後,幀率變快了,看起來很彆扭,實際上是每秒執行一次的 h 檔案 inte ce countdownview uiview property nonatomic,assign long long time property nonatomic,assign,readonly lo...