0

내 게임에서 사용자가 전원을 아직 켰는 지 여부에 대한 "bool"값을 저장합니다. 이를 위해 NSUserDefaults를 사용하고 있습니다.NSUserDefaults - 사용 및 재사용을 위해 데이터 저장 - 새로 시작할 때마다 지우기?

( [NSUserDefaults standardUserDefaults] : 매크로가있다 "저장"참고)

: 나는 원래 NSUserDefaults 그래서 내 코드를 삽입하고 (다음 모든 코드가 AppDelegate.m 파일에) 설명하자에 대한 온라인 튜토리얼을 따라했다

powerups = [[NSMutableArray alloc] init]; 
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"dateKey"] == nil) { 
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:[NSDate date], @"dateKey", nil]; 
    [save setBool:NO forKey:POWER_1]; 
    [save setBool:NO forKey:POWER_2]; 
    [save setBool:NO forKey:POWER_3]; 
    [save setBool:NO forKey:POWER_4]; 
    [save setBool:NO forKey:POWER_5]; 
    [save setBool:NO forKey:POWER_6]; 
    [save setBool:NO forKey:POWER_7]; 
    [save setBool:NO forKey:POWER_8]; 
    [save setBool:NO forKey:POWER_9]; 

    [save setInteger:0 forKey:@"1HighScore"]; 
    [save setInteger:0 forKey:@"2HighScore"]; 
    [save setInteger:0 forKey:@"3HighScore"]; 
    [save setInteger:0 forKey:@"CumulativeScore"]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    NSLog(@"firstrun"); 
} 

그래서 위의 코드에서 게임의 모든 클래스에서 호출 할 수있는 배열을 만들면서 사용 가능한 모든 전원 공급을 저장합니다. 이 "if"문은 NSUserDefaults에 모든 데이터 값을 만들기 때문에 게임을 처음 실행하는 경우에만 호출해야합니다. 참고 : jailbroken iPhone을 사용하고 생성 된 .plist 파일을 검사했습니다. "dateKey"의 값으로 불리는 어떤 가치도없는 것처럼 보입니다. 이 튜토리얼은 이것이 이것이 첫 번째 실행인지를 확인하는 방법이라고 설명했다. 왜냐하면 날짜 값이 존재하지 않으면 첫 번째 실행 등이 없기 때문이다. 논리적으로 말이된다. 그것은 모든 새로운 실행에 그 보인다 지금

if([save boolForKey:POWER_1]) 
    [powerups addObject:POWER_1]; 
if([save boolForKey:POWER_2]) 
    [powerups addObject:POWER_2]; 
if([save boolForKey:POWER_3]) 
    [powerups addObject:POWER_3]; 
if([save boolForKey:POWER_4]) 
    [powerups addObject:POWER_4]; 
if([save boolForKey:POWER_5]) 
    [powerups addObject:POWER_5]; 
if([save boolForKey:POWER_6]) 
    [powerups addObject:POWER_6]; 
if([save boolForKey:POWER_7]) 
    [powerups addObject:POWER_7]; 
/*if([save boolForKey:POWER_8]) 
[powerups addObject:POWER_8];*/ 
if([save boolForKey:POWER_9]) 
    [powerups addObject:POWER_9]; 

:

지금, 다음 코드는 NSUserDefaults는 이전에 그냥 "인구"또는 저장되었는지 여부, 존재해야하는 것이 주어진 배열을 채 웁니다 첫 번째 "if"문은 YES이고 모든 값은 첫 번째 코드 상자에 따라 다시 설정됩니다. 그러면 두 번째 코드 상자가 그에 따라 작동하고 배열이 채워지지 않습니다. 모든 것이 재설정되었으므로 ...

이것은 registerDefaults과 관련이 있습니다. 전화 나 사용이 필요합니까? 문제가 무엇입니까?

덕분에 모두가 희망을 갖고 나는

rnc505

+0

시뮬레이터 또는 장치에서 테스트 중이십니까? – LearnCocos2D

+0

둘 다 테스트 중이지만 장치에서 발생합니다. 시뮬레이터에서 제대로 테스트하지 못했지만, 분명히 어쨌든 장치가 가장 중요합니다. –

답변

1

문제는 기록되지 등록 도메인의 애플 문서

내용에 따라 디스크에 기록되지 registerDefaults입니다 :) 분명했다 디스크에; 은 응용 프로그램이 시작될 때마다이 메소드를 호출해야합니다.

당신은 1) registerDefaults를 사용하고 디스크에 기록하고 코드가 작동하게됩니다이

[save setObject:[NSDate date] forKey:@"dateKey"]; 

이처럼 "날짜"를 저장하지 않는이 옵션을 사용할 수 있습니다.

더 강력한 방법은 모든 파워 업을 registerDefaults에 쓰고 날짜를 삭제하는 것입니다. 다음과 같이 registerDefaults가 appDelegate의 initialize 메서드에 추가되기 전에 호출되도록하려면

+ (void)initialize { 
    NSMutableDictionary *defs = [NSMutableDictionary dictionary]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_!]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_2]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_3]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_4]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_5]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_6]; 
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_7]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defs]; 
} 
+0

이렇게하면 시작할 때마다이 메소드가 호출됩니다. 그 값들이 이미 존재하지 않는다면, 그것들을 생성하고 만약 그것들이 이미 존재한다면 그것은 무시됩니다. 그러나 그 데이터는 어떻게 계속 유지됩니까? 연속적인'[setObject : [OBJECT] forKey : [KEY]]'와'[save sychronize]'호출을 통해? –

+0

위의 initialize 메서드의 코드 앱을 실행할 때마다 기본값을 등록합니다. NSUserDefaults에 해당 키에 대한 값이없는 경우이 값이 사용됩니다. 그런 다음 사용자가 Power를 얻을 때마다'[NSUserDefaults standardDefaults] setBool : YES forKey : POWER_4]를 호출하는 디스크에 저장합니다. ' – agilityvision

+0

오 그래, 고마워. :) 알았어. –