如果您想知道该表是否已弹出,请将您的清理/保存方法放入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) 当 stepperUIControlEventValueChanged
被调用时,你显然应该改变你的数据模型,然后调用上述ModelDataItem
方法scheduleSave
;
(b) 当表格视图被关闭时,应该立即保存任何未决的内容:
for (ModelDataItem *item in allModelDataItems)
{
if (item.needSave)
[item save];
}
请注意,在最后一点上,我不依赖于dealloc
清理和保存需要保存的模型项目,因为计划NSTimer
保留它target
,因此dealloc
不会被调用(或者至少在执行计时器之前不会被调用)。所以,我手动遍历它们并在我关闭视图时处理它。