ios - NSUserDefaults 没有快速更新值

标签 ios xcode nsuserdefaults

我有超时功能,如果应用程序空闲(在后台)一段时间,我会超时我的应用程序并将用户发送到登录屏幕。我在我的应用程序委托(delegate)中将用户默认设置中的“timedOut”键设置为 YES,然后在每个 View Controller 中引用该键,如果它是 YES,我将转至登录屏幕。在登录屏幕上,如果“timedOut”为"is",我有一个标签显示“ session 已超时”。我的问题是,如果我登录,然后很快注销,就会显示标签,即使我在显示标签后立即将该键显式设置为 NO,然后同步用户默认值。 如果我等一两秒钟然后注销,标签就会像它应该的那样被隐藏。我已经解决了“问题”,但想了解行为。

View 中的代码确实加载到我的登录 View Controller 中。你会认为这会将 isTimedOut 更改为 NO,但是当我快速注销时,再次调用 viewdidload,但 isTimedOut 为 YES。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
sessionLabel.hidden = YES;
isTimedOut = [defaults boolForKey:@"isTimedOut"];
if (isTimedOut == YES)
{
    sessionLabel.hidden = NO;
    defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"isTimedOut"];
    isTimedOut = NO;
    NSLog(@"Timed Out has been reset to %s",[defaults boolForKey:@"isTimedOut"] ? "YES" : "NO");
    [defaults synchronize];

}

更新

我使用我的应用委托(delegate)中的一个属性代替了 NSUserDefaults 替换了上面的代码,“奇怪”的行为消失了。

eONavAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
isTimedOut = appDelegate.isTimedOut;
sessionLabel.hidden = YES;
//isTimedOut = [defaults boolForKey:@"isTimedOut"];
  NSLog(@"Timed Out has been reset to %s",appDelegate.isTimedOut ? "YES" : "NO");
if (isTimedOut == YES)
{
    appDelegate.isTimedOut = NO;
    sessionLabel.hidden = NO;

}

更多代码

要注销,我让 UIButtonBarItem 以编程方式调用 segue。 doLogout 属性告诉登录 View Controller 运行注销 API。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"logoutSegue"])
{

    // Get reference to the destination view controller
    eoLoginViewController *vc = [segue destinationViewController];
    vc.doLogout = YES;

}
} 

isTimedOut 设置在应用委托(delegate)的一个位置。

-(void)timeoutWithDate:(NSDate *)currentDate
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDate *previousDate  = [defaults objectForKey:@"enteredBackground"];
NSTimeInterval distanceBetweenDates = [currentDate timeIntervalSinceDate:previousDate];//TimeInterval is in seconds
NSLog(@"Time between dates in seconds %f",distanceBetweenDates);

double minutesInAnHour = 60;
double minutesBetweenDates = distanceBetweenDates / minutesInAnHour;
NSLog(@"minutesBetweenDates %f",minutesBetweenDates);


if(minutesBetweenDates > 60)
{
    isTimedOut = YES;

}
else
{
    isTimedOut = NO;
}

}

最佳答案

使用这个:

保存 bool 值:

[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isTimedOut"];

加载 bool 值:

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isTimedOut"] == YES) {
        //it equals yes
        }

    else {
        //it equals no
        }

关于ios - NSUserDefaults 没有快速更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900718/

相关文章:

ios - Xcode 测试 - 未显示在左侧边栏中

objective-c - iOS 4 上的推送通知如何显示?

ios-应用程序关闭后如何保存按钮状态?

ios - 将对象添加到 NSuserDefault 中的现有键

ios - certificatesInBundle 不附加自签名证书

ios - 我删除了 Xcode 中的本地化,然后我无法添加任何本地化

ios - XCode:以编程方式启用符号断点?

c - 通过 xCode 运行终端和命令

ios - 由于单元格为空,如何检索 UserDefaults

android - 推送通知中的深层链接问题