2014-03-31 5 views
3

앱을 처음 시작할 때 한 번만 ViewController를 열려고합니다. 아래는 제 코드입니다. 문제는 내가 YES를 쓸 때 NSUserdefaults, 동기화를 수행 한 다음 앱을 닫을 때입니다. 시뮬레이터를 사용하는 Xcode에서 값은 Yes로 업데이트되지 않습니다. NSUserDefaults 값을 저장할 수 없습니다. iOS

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isFirstLaunch"]) 
    { 
     // app already launched 
     [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],@"isFirstLaunch", nil]]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
    } 

    else 
    { 
     [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"isFirstLaunch", nil]]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
    } 

    return YES; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isFirstLaunch"]) 
    { 
      NSLog(@"first time"); 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    LASplashUserSettingViewController *splash = [storyboard instantiateViewControllerWithIdentifier:@"splash"]; 
    [self.window.rootViewController presentViewController:splash animated:NO completion:nil];// 
    } 

} 

Why is NSUserDefaults not saving my values?

위 다음에 다른 많은 링크하게한다. 나는 무엇을 여기에서 놓치고 있냐? 감사합니다.

답변

2

무엇이 여기에 있습니까?

doesn't do what you think it does. 대신 -setBool:forKey:을 사용하십시오.

-registerDefaults:은 기본값 시스템의 특정 키에 값이 존재하는지 확인하는 데 사용됩니다. 등록 도메인의 값이 절대로 저장되지 않기 때문에 -synchronize을 호출 할 필요가 없습니다. 이 메서드를 사용하여 isFirstLaunch에 기본값 YES을 설정하려고했지만 코드에서 의 값을 확인한 후에을 기본값으로 등록하십시오! 그 방법의 목적을 무너 뜨린다. 올바르게 사용하려면 -registerDefaults:을 먼저 호출 한 다음 키와 관련된 값을 확인하고 값이 YES이면 -setBool:forKey:을 호출하여 NO 값을 저장합니다.

첫 번째 출시를 감지하는 더 간단한 옵션은 질문을 뒤집는 것입니다. -registerDefaults: 호출을 모두 건너 뛰고 키를 appHasRunPreviously으로 변경하십시오. 지정된 키에 값이 저장되어 있지 않은 경우 -boolForKey:NO을 반환합니다. 이런 일이 발생하면 앱이 처음 실행된다는 것을 알게되고 을 사용하여 해당 키에 대해 YES을 저장해야합니다.

+1

링크가 매우 유용합니다. 감사합니다 .. Caleb .. – LUI

-2

당신은 당신이 AppDelegate.m에 NSUserDefaults를 사용하는 방법이

[[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"AlreadyLaunched"]; 


[[NSUserDefaults standardUserDefaults]boolForKey:@"AlreadyLaunched"] 
0

을이됩니다 시도 할 수

+ (void)initialize 
{ 
    // Register defaults for first time 
    NSMutableDictionary *defs = [NSMutableDictionary dictionary]; 
    [defs setObject:[NSNumber numberWithBool:YES] forKey:@"isFirstLaunch"]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defs]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if([defaults boolForKey:@"isFirstLaunch"]) 
    { 
     // Do your stuff here 

     [defaults setBool:NO forKey:@"isFirstLaunch"]; 
     [defaults synchronize]; 
    } 
} 

당신은 단지를 원하는 경우 다른 조건에 YES로 다시 isFirstLaunch을 설정하지 마십시오 보기가 한 번 표시됩니다.

관련 문제