Данные NSUserDefaults сначала не отображаются? - PullRequest
0 голосов
/ 19 марта 2011

Когда я запускаю свое приложение, оно переходит в домашний вид и не отображает существующие палитры, сохраненные в NSUserDefaults. Но когда я нажимаю кнопку «Новая палитра» и возвращаюсь, она показывает новую и все существующие. Не могу добраться до сути этого. Любая помощь приветствуется.

приложение делегат.h:

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

приложение делегат.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

1 Ответ

1 голос
/ 30 марта 2011

Проблема в том, что когда вы загружаете приложение и вызывается ваш делегат приложения, вы не восстанавливаете его содержимое из NSUserDefaults.Вы просто создаете его, если его ноль, но это не решает проблему.Вам следует заполнить массив colourPalettesContainer значениями в вашем приложении: didFinishLaunchingWithOptions: method.

Кроме того, приведенный выше комментарий Калле является актуальным;Вы не должны использовать свой делегат приложения таким образом.Наилучший подход IMHO - это обернуть его в собственный класс, который заботится о сохранении значений по умолчанию при первом запуске, управляет версиями, предоставляет строго типизированный интерфейс и при необходимости может быть подклассами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...