Доступ к AppDelegate и его изменение вне его - PullRequest
0 голосов
/ 05 октября 2011

В моем viewController есть объект пользовательского класса PolyShape . Основной переменной является количество сторон, и это изменяет все остальное в приложении.

Я пытаюсь использовать AppDelegate и NSUserDefaults для хранения количества сторон на NSUserDefault , но моя проблема заключается в обмене данными между AppDelegate и мой viewController .

Я видел, что вы можете позвонить на AppDelegate с этой строкой кода YourAppDelegate * appDelegate = (YourAppDelegate *) [[UIApplication sharedApplication] делегат]; что, кажется, не работает для меня.

Но если предположить, что этот DID работает, и я смог вызвать значение из AppDelegate, как бы я записал его обратно в приложение, которое скоро закроется? Вот мой код:

@synthesize window = _window;
@synthesize polySides;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self setPolySides: [[NSUserDefaults standardUserDefaults] integerForKey:@"polysides"]];

    [self.window makeKeyAndVisible];
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    /*
    Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    */
    [[NSUserDefaults standardUserDefaults] setInteger: self.polySides forKey:@"polysides"];
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    /*
    Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
 If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    */
    [[NSUserDefaults standardUserDefaults] setInteger: self.polySides forKey:@"polysides"];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
    Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    */
    [self setPolySides: [[NSUserDefaults standardUserDefaults] integerForKey:@"polysides"]];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    /*
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    */
}

- (void)applicationWillTerminate:(UIApplication *)application {
    /*
    Called when the application is about to terminate.
    Save data if appropriate.
    See also applicationDidEnterBackground:.
    */
    [[NSUserDefaults standardUserDefaults] setInteger:polygon.numberOfSides forKey:@"polysides"];
}

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

РЕДАКТИРОВАТЬ: Я думаю, я не был ясен. Что я хочу сделать, это следующее:

[[NSUserDefaults standardUserDefaults] setInteger: polygon.numberOfSides forKey: @"polysides"];

где многоугольник - это объект в моем контроллере. Точно так же я хотел бы иметь возможность сделать

[polygon.setNumberOfSides: [[NSUserDefaults standardDefaults] integerForKey: @"polysides"];

1 Ответ

0 голосов
/ 05 октября 2011

Вам нужно синхронизировать значения по умолчанию после того, как вы сделали набор:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger: self.polySides forKey:@"polysides"];
[defaults synchronize];
...