2012-02-23 44 views
0

我认为我的问题并不难解决。我必须错过某些东西。我让我的用户使用Facebook登录,因此在应用程序设置中,我可以选择使用开/关开关从Facebook注销。我在Settings.bundleRoot.plist看起来是这样的:iOS - 应用程序设置,试图重置开关

<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> 

所以基本上我以后的功能是,如果用户切换开关置于ON,他应该从Facebook注销。在他注销后,开关应该切换回OFF。所以我想OFF作为交换机的默认值。

由于布尔默认为NO(OFF)我想我并不需要使用NSUserDefaultregisterDefaults:

所以我在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]; 

但由于某些原因,这段代码似乎并不奏效。大部分时间都有效(检查后swith关闭)。但有时即登录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小时,但真的不能进一步检讨。

回答

2

出于某种原因,我似乎必须在用户设置应用程序设置后执行[[NSUserDefaults standardUserDefaults] synchronize];。我只认为在将值保存到NSUserDefaults之后,您只能直接拨打-synchronize,但显然似乎您必须在检索到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];