iOS - 应用程序设置,尝试重置交换机

时间:2012-02-23 23:49:48

标签: ios cocoa-touch nsuserdefaults settings.bundle

我认为我的问题并不难解决。我一定错过了什么。我允许我的用户使用Facebook登录,因此在应用程序设置中,我可以选择使用开/关切换从Facebook注销。 Root.plist Settings.bundle中的<dict> <key>PreferenceSpecifiers</key> <array> <dict> <key>Title</key> <string></string> <key>Type</key> <string>PSGroupSpecifier</string> </dict> <dict> <key>DefaultValue</key> <false/> <key>Key</key> <string>facebookLogoutTriggered</string> <key>Title</key> <string>Logout Facebook</string> <key>Type</key> <string>PSToggleSwitchSpecifier</string> </dict> </array> <key>StringsTable</key> <string>Root</string> </dict> 如下所示:

NSUserDefault

所以基本上我所追求的功能是,如果用户将开关切换到ON,他应该从Facebook注销。在他退出后,开关应切换回OFF。所以我希望OFF成为开关的默认值。

由于布尔值默认为NO(OFF)我认为我不需要使用registerDefaults:的{​​{1}}

所以我检查applicationWillEnterForeground:是否用户通过选中此选项将应用设置中的开关设置为开启:

// Check if the user wants to logout from Facebook
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL facebookLogoutTriggered = [defaults boolForKey:@"facebookLogoutTriggered"];

// Set "Logout Facebook" setting to OFF (NO)    
[defaults setBool:NO forKey:@"facebookLogoutTriggered"];
[defaults synchronize];

但由于某种原因,这段代码似乎不起作用。它大部分时间都有效(检查后关闭开关)。但有时候,在登录Facebook之后,由于某种原因,它会将开关设置为开启。登录Facebook后运行的代码如下:

#pragma mark - FBSessionDelegate Methods

- (void)fbDidLogin {

    DLog(@"User logged in to Facebook.");

    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];

    // Save accesstoken and expirationdate
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[appDelegate.facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[appDelegate.facebook expirationDate] forKey:@"FBExpirationDateKey"];

    [defaults synchronize];

    DLog(@"defaults %@", [defaults objectForKey:@"facebookLogoutTriggered"]);

}

现在试图解决这个问题6个小时,但实际上还没有进一步。

1 个答案:

答案 0 :(得分:2)

出于某种原因,似乎在用户设置了应用程序设置后我必须执行[[NSUserDefaults standardUserDefaults] synchronize];。我认为您必须在将值保存到-synchronize后直接致电NSUserDefaults,但显然您必须在检索NSUserDefaults之后直接调用它,如果用户设置了应用程序设置中的首选项(Settings.bundle)。

所以不要这样做:

// Check if the user wants to logout from Facebook
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL facebookLogoutTriggered = [defaults boolForKey:@"facebookLogoutTriggered"];

// Set "Logout Facebook" setting to OFF (NO)    
[defaults setBool:NO forKey:@"facebookLogoutTriggered"];
[defaults synchronize];

我现在这样做:

// Check if the user wants to logout from Facebook
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Make SURE we get the updated data from the Application Settings
[defaults synchronize];
BOOL facebookLogoutTriggered = [defaults boolForKey:@"facebookLogoutTriggered"];

// Set "Logout Facebook" setting to OFF (NO)    
[defaults setBool:NO forKey:@"facebookLogoutTriggered"];
[defaults synchronize];