2013-05-30 2 views
0

내 머리가 어긋나는 문제가 있습니다. NSUserDefaults 인스턴스가 있고 거기에 일부 값을 저장했습니다. 이 값 중 하나는 다른 디스플레이에서 사용될 플레이어 점수 (게임)가 포함 된 배열입니다. 게임이 끝난 후 배열을 새 점수로 업데이트하고 NSUserDefaults에 다시 할당합니다. 그러나 콘솔에 카운트를 인쇄하려고 할 때 어떤 이유로 디버그가 제대로 작동하지 않는 것처럼 보입니다. 지금까지 만든이NSUserDefaults 배열이 제대로 저장되지 않습니다.

// // SAMHighScoreInputViewController.m // Tappity // // Created by Sam on 29/05/13. // Copyright (c) 2013 Sam. All rights reserved. // 

#import "SAMHighScoreInputViewController.h" 
#import "SAMScoreObject.h" 

@interface SAMHighScoreInputViewController() 

@end 

@implementation SAMHighScoreInputViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; } 

- (void)viewDidLoad { 
    self.defaults = [NSUserDefaults standardUserDefaults]; 
    self.nameScoreLabel.text = [NSString stringWithFormat:@"%@ - %@", [self.defaults objectForKey:@"lastName"], [self.defaults objectForKey:@"lastScore"]]; 
    self.nameTextField.text = [self.defaults objectForKey:@"lastName"]; 

    [super viewDidLoad]; // Do any additional setup after loading the view. } 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. } 





- (IBAction)textFieldValueChanged:(UITextField *)sender { 

    self.nameScoreLabel.text = [NSString stringWithFormat:@"%@ - %@", self.nameTextField.text, [self.defaults objectForKey:@"lastScore"]]; 
    } 

- (IBAction)submitButtonTapped:(UIButton *)sender { 



    SAMScoreObject *score = [[SAMScoreObject alloc] init]; 

    score.playerName = self.nameTextField.text; 
    score.score = [self.defaults integerForKey:@"lastScore"]; 



    NSArray *scores = [self.defaults objectForKey:@"scoresArray"]; 

    NSMutableArray *updatedArray = [scores mutableCopy]; 

    [updatedArray addObject:score]; 

    NSArray *updatedArrayScores = [updatedArray copy]; 

    [self.defaults setObject:updatedArrayScores forKey:@"scoresArray"]; 

    [self.defaults setObject:[self.defaults objectForKey:@"scoresArray"] forKey:@"scoresArray"]; 

    [self.defaults synchronize]; 


    NSLog(@"%@, %@", [self.defaults objectForKey:@"lastScore"], [self.defaults objectForKey:@"lastName"]); 
    NSLog(@"%i", [[self.defaults objectForKey:@"scoresArray"] count]); 


    [self dismissViewControllerAnimated:YES completion:nil]; 
    } @end 
+0

오류가 보이지 않지만 코드에 두 가지 개선 사항을 제안합니다. 1) 배열의 다른 복사본을 만들고'updatedArrayScores'에 할당하는 단계는 불필요합니다.'updatedArray'를' NSUserDefaults'. 2) for [: self.defaults objectForKey : @ "scoresArray"] forKey : @ "scoresArray"];'문장을 완전히 삭제할 수 있습니다. – herzbube

+0

'self.defaults'의 속성은 어떻게 설정되어 있습니까? 당신은 그것을 확실히 가지고 있습니까? 유지되지 않으면'setObject : forKey :'와 'synchonize' 메소드를 보내기 전에 해제되었을 수 있습니다. 그러면 자동으로 실패합니다. – lukestringer90

답변

1

scoresArray입니다 : 여기

0 문제의 코드? 업데이트를 시도 할 때 느리게 생성해야합니다. 예를 들어 :

NSArray *scores = [self.defaults objectForKey:@"scoresArray"]; 
if(scores == nil) 
{ 
    scores = [NSArray array]; 
} 
NSMutableArray *updatedArray = [scores mutableCopy]; 
+0

종류는 이미 어느 정도까지는했지만 문제가 해결되지 않았습니다. 도움을 주신 것에 감사드립니다. – flux

2

당신은 당신이 NSUserDefaults 저장소에 저장할 수 있습니다 전에 SAMScoreObject 어떤 형태의 NSData 객체로 직렬화 할 필요가있다. documentation에서

:

는 기본 객체는 속성 목록이 있어야합니다, 즉, (의 인스턴스의 조합 또는 모음)의 인스턴스 :있는 NSData,있는 NSString,의 NSNumber,있는 NSDate, NSArray를, 또는 NSDictionary. 다른 유형의 객체를 저장하려면 일반적으로 객체 유형을 저장하여 NSData의 인스턴스를 만들어야합니다.

NSArray 개체를 저장한다는 사실은 그 배열의 개체가 지원되는 형식 중 하나가 아니기 때문에 충분하지 않습니다.

+0

이것은 일이 제대로 작동하지 않는 가장 그럴듯한 이유입니다. – lukestringer90

관련 문제