簡體   English   中英

如何從UITableViewCell內部知道何時彈出其父表視圖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM