2014-04-22 57 views
0

我有一個包含單個項目的設置包。該項目是一個設置爲NO的開關。使用NSUserDefaults不起作用的應用程序設置

我正在使用它來允許用戶註銷我想要創建的應用程序。但是,當用戶打開應用程序時,轉到設置並選擇切換到註銷時,他們回到應用程序沒有任何反應。如果他們回到設置再次切換,然後回去,然後如果報名進入corrently ...

這幾乎就像設置不是第一次讀,但我不知道如何解決這個問題...

這是我的代碼是什麼樣子

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; 
    NSNumber *branchString = [settings objectForKey:@"signout"]; 

    NSLog(@"%@", branchString); 

    if ((branchString != nil) || (branchString != 0)) {  
     // turn signout back on. 
     [settings setObject:NO forKey:@"signout"]; 
     [settings synchronize]; 
    } 
} 

任何幫助,將不勝感激。

回答

1

用戶默認行爲像其他容器類一樣:它們將對象作爲元素而不是標量類型。所以,你需要換行的標量型(BOOL)與NSNumber

[settings setObject:[NSNumber numberWithBool:NO] forKey:@"signout"]; 
// with modern syntax 
[settings setObject:@(NO) forKey:@"signout"]; 

但它聽起來就像你從交換機獲得的價值,所以你將不能夠使用新的文字語法,那就是:

[settings setObject:[NSNumber numberWithBool:self.mySwitch.on] forKey:@"signout"]; 

記住,從默認讀書回來的時候,你需要解開包裹縮放,像這樣:

self.mySwitch.on = [[settings objectForKey:@"signout"] boolValue]; 
+1

您也可以使用短格式@(NO),或者僅使用@NO。 – iamamused

+0

它很難解釋,但我會嘗試。目前,當我第一次訪問NSUSerDefault時,這些值不是可用的。所以當我第一次註銷它沒有看到。我退出應用程序並再次回到它,然後我的代碼工作。是的,我的代碼與您的示例有關,但是現在交換機正在被正確重置,從不登出,因爲當我第一次使用它時,它會切換回NO。我第二次登錄沒有任何反應。我不知道爲什麼會發生這種情況。 – HurkNburkS

+0

@HurkNburkS - 不太關注你,但要記住,在閱讀和設置開關值(或者你正在做的任何事情)時你必須打開對象。請參閱我的編輯。 – danh

0

您發佈的代碼是混亂的。應用程序第一次運行(並且用戶尚未設置並更改開關)時,branchString將爲nil,應該將其視爲NO

你的代碼應該是這樣的:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; 
    BOOL signout = [settings boolForKey:@"signout"]; 

    NSLog(@"%d", signout); // will be 0 (NO) or 1 (YES) 

    if (signout) {  
     // The user has changed the switch to on 
     // turn signout back off. 
     [settings setBool:NO forKey:@"signout"]; 
     [settings synchronize]; 
    } else { 
     // The user has either changed the switch to off or it is still off by default 
    } 
} 

你原來if說法是沒有意義的,因爲一旦用戶更改交換機上,然後後,即使它是真的,那將是真正的他們再次關閉開關。

備註 - 爲什麼你要讓用戶切換到Settings應用程序才能註銷?爲什麼不提供在應用程序中註銷的功能?這將是一個更好的用戶體驗。

相關問題