[英]How can I tell from inside a UITableViewCell when its parent table view has been popped?
我有一個包含UIStepper的UITableViewCell子類。 當用戶與步進器交互時,我啟動了NSTimer,以便步進器將保存其值並在2秒鍾內再次更改該值時將其寫入Core Data。
換一種方式:
UIStepper包含在UITableViewCell中。
用戶可以上下更改步進值。
每次觸摸都會以2秒的延遲觸發計時器。
隨后的每次觸摸都會使計時器無效。
將步進器放置2秒鍾后,將保存更改。
這對於我需要的東西非常有效。 問題是,如果我的用戶非常快並且他們更改了值,然后彈出視圖控制器並執行其他操作,則2秒計時器仍未觸發,並且下一個操作的數據不是最新的。
為了使事情盡可能簡單,我需要能夠在該表視圖單元格中判斷(表)視圖是否彈出。 然后,我可以加快保存過程,並確保在執行任何其他操作之前,數據是最新的並已保存。
如果要告訴您是否已彈出該表,請將您的cleanup / save方法放入viewWillDisappear
方法中。 因為您使用的是計時器,所以您不希望它使用dealloc
,所以您不會有任何意外的強引用周期。
從您的問題尚不清楚,但是我想確保您沒有將NSTimer
放在UITableViewCell
單元上。 顯然,這是一個模型問題,而不是視圖問題,而且表視圖還為出隊列和重用表視圖單元進行了各種優化。
其次,無論您要跟蹤數據的任何對象類(我稱為ModelDataItem
),都不僅應提供保存機制,使用計時器等,還應提供一種機制來強制保存任何未決記錄(我通過布爾的needSave
)。 因此,為了支持這一點,在我看來,您的ModelDataItem
可能至少應包含以下四個項目:
(a)提述其本身的計時器;
@property (nonatomic, strong) NSTimer *timer;
(b)一個標志,指示記錄是否具有待處理的保存操作
@property (nonatomic) BOOL needSave;
(c)每當對象的值更改(例如,值增加)時調用的方法,以在2秒內安排保存:
- (void)scheduleSave
{
self.needSave = YES;
if (self.timer)
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(save)
userInfo:nil
repeats:NO];
}
(d)您需要計時器調用的實際保存記錄的方法:
- (void)save
{
// do whatever you need to save the record
NSLog(@"%s saving value=%@", __FUNCTION__, self.value);
// now let's clean up the timer
if (self.timer)
{
[self.timer invalidate];
self.timer = nil;
}
self.needSave = NO;
}
然后,在表視圖控制器中,您應該:
(a)調用步進器的UIControlEventValueChanged
,顯然應該更改數據模型,然后調用上述ModelDataItem
方法scheduleSave
;
(b)在關閉表視圖時,應該立即保存任何未決的內容:
for (ModelDataItem *item in allModelDataItems)
{
if (item.needSave)
[item save];
}
請注意,關於最后一點,我不依賴於dealloc
清理並保存需要保存的模型項,因為預定的NSTimer
保留了其target
,因此dealloc
不會被調用(或者至少直到定時器被調用時才被調用)。執行)。 因此,我手動遍歷它們,並在關閉視圖時進行了處理。
您可以讓您的自定義單元偵聽表視圖即將消失的通知,然后將該通知發布到視圖控制器的viewWillDisappear
方法中。
當彈出我認為您正在使用的NavigationController的父TableView時,應該取消分配TableView。 此外,還應取消分配其每個TableViewCells。
您可以使計時器無效,並在TableViewCell的dealloc方法中處理所有未決的更新。
在不更改設計的情況下,這就是我會嘗試的方法。 如果事實證明是有問題的,則還可以嘗試在此值更改時建立與TableView的某種通信,並讓TableView負責數據更新。
很難從您的描述中看出來,但我認為您根本不需要使用計時器。 您不能只是將stepper值分配給該類的屬性或ivar,然后在viewDidDisappear方法中將該值寫到核心數據中嗎?
我發現過去最好的方法是將UITableViewCell子類設置為視圖控制器的委托...然后在您的視圖控制器中,viewDidDisappear只需調用委托方法。
該委托方法將在您的UITableViewCell子類中實現,並且將僅調用與您的第二個計時器完成時相同的代碼。 這與Phillip建議的通知方法類似,但是如果您習慣於分配委托等,則可以稍微簡化一點。
只需重寫dealloc方法並執行操作即可。 彈出/卸載父視圖時,將釋放UITableViewCell。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.