iOS Objective-C:奇怪的BOOL行为

时间:2015-06-20 23:14:09

标签: ios objective-c sdk boolean nstimer

我有一个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!所以核心数据值似乎是正确的,只是没有_运行!

0 个答案:

没有答案