Все просто. Вместо того, чтобы каждый контроллер представления имел свою собственную копию CustomObject и пытался синхронизировать их через NSUserDefaults, оба контроллера представления совместно используют один и тот же экземпляр CustomObject.
Кроме того, вы также можете попробовать использовать шаблон проектирования Observer . Ваши контроллеры представлений будут играть роль Observer, а отдельный экземпляр CustomObject будет играть роль Subject.
Подробная информация о сохранении / загрузке состояния customObject
в / из пользовательских значений по умолчанию должна быть заключена в customObject
и скрыта от ваших контроллеров представления. Ваши контроллеры представления не должны знать как customObject
сохранить / загрузить NSDictionnary
в / из пользовательских значений по умолчанию. Ваш класс customObject
должен выглядеть примерно так:
@interface CustomClass : NSObject
@property (nonatomic, strong) NSString* name;
@property (nonatomic, assign) float value;
- (void)save;
- (void)load;
// Other methods
@end
@implementation CustomClass
@synthesize name = name_;
@synthesize value = value_;
- (void)save
{
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
name_, @"Name",
[NSNumber numberWithFloat:value_], @"Value",
nil];
[[NSUserDefaults standardUserDefaults] setObject:dict
forKey:@"CustomObject"];
}
- (void)load
{
NSDictionary* dict = [[NSUserDefaults standardUserDefaults]
objectForKey:@"CustomObject"];
name_ = [dict objectForKey:@"Name"];
NSNumber* valueNum = [dict objectForKey:@"Value"];
value_ = [valueNum floatValue];
}
@end
Ваш customObject
должен быть загружен один раз при запуске приложения. Единственное место, где вы можете это сделать, - это метод didFinishLaunchingWithOptions
вашего AppDelegate:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[sharedCustomObject load];
}
В ваших контроллерах вида viewWillAppear
вам не нужно заставлять sharedCustomObject
перезагрузить себя. Уже будет храниться текущее состояние .
В контроллерах вида 'viewWillDisappear
вам нужно только убедиться, что состояние sharedCustomObject
равно , резервное копирование по умолчанию пользователя.
- (void)viewWillDisappear:(BOOL)animated
{
[sharedCustomObject save];
}
После сохранения sharedCustomObject
все еще актуален и не требует перезагрузки .
Надеюсь, теперь все стало понятнее. : -)