我有一个BOOL似乎在没有分配的情况下改变了价值!但是,它仅在视图控制器之间切换时发生。基本上我有一个TableViewController转到DetailViewController,BOOL在DetailViewController上。它用于确定计时器当前是否正在运行。当只停留在DetailViewController上时,BOOL按预期工作,但是当在DetailViewController和TableViewController之间切换时,问题发生时就是这样。在TableViewController上没有任何地方被分配给。
我到处都有NSLogged,我已经在BOOL上使用了很多断点和观察点,但是我仍然无法弄清楚是什么让它发生了变化!
好的,在DetailViewController的viewDidLoad上,BOOL从Core Data实体更新。
- (void)viewDidLoad {
[super viewDidLoad];
// MORE CODE
_running = [[_timerObject valueForKey:@"running"] boolValue];
****_running is NO on initial load**** - expected
****_running is YES when returning to DetailViewController**** - expected
// MORE CODE
}
然后我有一个按钮来启动/取消定时器并使用BOOL来切换按钮。
- (IBAction)start:(id)sender {
****_running is NO on first press**** - expected
****_running is YES on second press**** - NOT EXPECTED!?!?!?!
// if timer is running
if (_running) {
// CANCEL TIMER CODE
}
else {
// START TIMER CODE
}
// Update BOOL
_running = !_running;
****_running is YES**** - expected
}
当计时器完成时,将调用此方法。
- (void)timerComplete {
****_running is YES**** - expected
// OTHER CODE HERE
// Cancel timer
[_appDelegate.timerManager stopTimer:_timerID];
// Update BOOL
_running = NO;
****_running is NO**** - expected
// Save to ensure booleans are correct
[self save];
****_running is NO**** - expected
}
我的保存方法如下所示。它在timerComplete的末尾和viewDidDisappear方法中调用。
- (void)save {
// Create variable of managed object context AppDelegate
NSManagedObjectContext *context = [self managedObjectContext];
if (_timerObject) {
// Update existing timer
if ([_nameTextField.text isEqualToString:@""]) {
[_timerObject setValue:@"Timer" forKey:@"name"];
}
else {
[_timerObject setValue:_nameTextField.text forKey:@"name"];
}
[_timerObject setValue:_date forKey:@"timeStart"];
[_timerObject setValue:[NSNumber numberWithBool:_running] forKey:@"running"];
[_timerObject setValue:[NSNumber numberWithBool:_paused] forKey:@"paused"];
//----------------
// Update title of view
self.title = [_timerObject valueForKey:@"name"];
}
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
****_running is NO**** - expected
}
打破它所需的行为是: - 加载DetailViewContoller - 按开始计时器 - 返回TableViewController - 转到DetailViewController - 等待定时器完成 - 再次按启动计时器,没有任何反应,因为_running是YES,而不是NO!
我使用" _running"的值注释了代码段。在各个不同的地方。
据我所知,在timerComplete和再次按下启动之间没有任何反应,所以我不知道为什么BOOL在那个时候从NO变为YES!任何帮助将不胜感激! :)
只是一个额外的说明 NSLog(@" timerObject:%@",[_ timerObject valueForKey:@" running"]);
当放置在_running在启动计时器方法中返回YES的位置时输出0!所以核心数据值似乎是正确的,只是没有_运行!