2011-03-19 5 views
0

내 앱을 시작할 때 홈 뷰로 이동하고 NSUserDefaults에 저장된 기존 팔레트를 표시하지 않습니다. 그러나 '새 팔레트'버튼을 클릭하고 돌아 가면 새 팔레트와 기존 팔레트가 모두 표시됩니다. 이 밑바닥에 도달 할 수 없습니다. 어떤 도움을 주셔서 감사합니다.NSUserDefaults 데이터가 처음에 표시되지 않습니까?

응용 프로그램 delegate.h :

@interface palettesAppDelegate : NSObject <UIApplicationDelegate> { 
NSMutableArray *colourPalettesContainer; 
    NSUserDefaults *prefs; 
} 
@property (assign, readwrite) NSUserDefaults *prefs; 
@property (assign, readwrite) NSMutableArray *colourPalettesContainer; 
@end 

응용 프로그램 delegate.m :

#import "palettesAppDelegate.h" 

@implementation palettesAppDelegate 

@synthesize colourPalettesContainer, prefs; 

- (void)dealloc { 
    [colourPalettesContainer release]; 
    [super dealloc]; 
} 


@end 

Homeview.h :

#import <UIKit/UIKit.h> 
#import "HandlingPalettes.h" 

@interface HomeView : UIViewController { 

    HandlingPalettes *handlingPalettes; 

} 


@end 

Homeview.m :

#import "HomeView.h" 
#import <QuartzCore/QuartzCore.h> 


@implementation HomeView 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
palettesAppDelegate *dataCenter = (palettesAppDelegate *)[[UIApplication sharedApplication] delegate]; 

dataCenter.prefs = [NSUserDefaults standardUserDefaults]; 
dataCenter.colourPalettesContainer = [dataCenter.prefs objectForKey:@"palettes"]; 

handlingPalettes = [[HandlingPalettes alloc] init]; 

    [handlingPalettes newPalette]; 

} 

-(void)viewWillAppear:(BOOL)animated { 


    NSLog(@"view will appear: %i", [dataCenter.colourPalettesContainer count]); 
    int numberOfExisting = [dataCenter.colourPalettesContainer count]; 

} 

- (void)dealloc { 
    [handlingPalettes release]; 
    [super dealloc]; 
} 


@end 
,

HandlingPalettes.h :

#import <UIKit/UIKit.h> 

@interface HandlingPalettes : UIViewController { 

} 


-(void)newPalette; 



@end 

HandlingPalettes.m :

#import "HandlingPalettes.h" 
#import "HomeView.h" 
#import "palettesAppDelegate.h" 



@implementation HandlingPalettes 


-(void)newPalette { 

    palettesAppDelegate *dataCenter = (palettesAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    //If this is the first palette 
    if (dataCenter.colourPalettesContainer == nil) { 
    dataCenter.colourPalettesContainer = [[NSMutableArray alloc] init]; 
    } 
    //Add a new palette 

     [dataCenter.colourPalettesContainer addObject:@"Test1", @"Test2", nil]; 


    NSLog(@"Handling: %i", [dataCenter.colourPalettesContainer count]); 

    [dataCenter.prefs setObject:dataCenter.colourPalettesContainer forKey:@"palettes"]; 
[dataCenter.prefs synchronize]; 
} 
- (void)dealloc { 
    [super dealloc]; 
} 


@end 
+0

내가 누락되었거나 코드에서 언급하지 않은 NSUserDefaults입니까? –

+0

'dataCenter.prefs = [NSUserDefaults standardUserDefaults]; '이 시점에서 dataCenter는 거의 사용되지 않습니다. 그러나 최종 추측을하기 위해 아직 많은 코드가 누락되어 있습니다. 그래서 처음이 아닌지 확인해 보겠습니다. –

+0

fluchtpunkt가 맞을 것입니다. 특히 interface-builder-made 뷰에서 NIB로로드되는 경우에 특히 그렇습니다. 실제 응용 프로그램 대리자가 인스턴스화되기 전에 뷰를로드합니다. 일반적으로 응용 프로그램 위임을 "응용 프로그램의 중앙 데이터 원본"으로 사용하지 말고 대신 싱글 톤을 사용하는 것이 일반적입니다. – Kalle

답변

1

문제는 당신이 응용 프로그램을로드하고 앱 대표가 호출 될 때, 당신은에서 그 내용을 복원하지 마십시오이다 NSUserDefaults. 당신은 그것의 nil 만 만들면 그것은 문제를 해결하지 못합니다. colourPalettesContainer 배열에 응용 프로그램의 값 : didFinishLaunchingWithOptions : 메소드를 채워야합니다.

위의 Kalle의 의견도 관련성이 있습니다. 당신은 그렇게 응용 프로그램 대리인을 사용해서는 안됩니다. 가장 좋은 방법은 IMHO는 사용자 정의 클래스에 랩핑하는 것입니다.이 클래스는 처음 실행시 기본값 저장, 버전 관리 관리, 강력한 유형의 인터페이스 제공, 필요한 경우 하위 클래스가 될 수 있습니다.

관련 문제