2012-06-26 3 views
3

Итак, у меня есть приложение Master-Detail, которое имеет табличное представление с контроллером навигации, подробным представлением и модальным видом. Навигационное представление отображает названия напитков, подробный вид показывает выбранные данные о напитках, а модальный вид позволяет мне создать новый напиток или отредактировать существующий. Все заполнено из plist, который я уже переместил в каталог документов, и все читается от него просто отлично. Я знаю, что это работает, потому что я проверил с пустым plist, чтобы увидеть, изменились ли мои взгляды на пустой, и они успешно выполняются. Все мои взгляды работают отлично. Я могу добавлять и удалять напитки, а также обновлять таблицы с новым или удаленным или измененным напитком. Однако он не пишет файл plist успешно (я обновляю свой plist из массива с именем «drinks», который находится в моем masterViewController). Я думаю, это потому, что я пытаюсь использовать этот метод ниже внутри моего MasterViewController, а не в моей AppDelegate.mПытается сэкономить на plist, когда приложение завершается

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [searchPaths objectAtIndex:0]; 
    NSString *writeableDBPath = [documentsDirectory stringByAppendingPathComponent:@"DrinkDirections.plist"]; 

    [self.drinks writeToFile:writeableDBPath atomically:YES]; 
} 

Я испытал это путем размещения 2 NSLogs(): один в методе applicationWillTerminate что I помещенный в мой masterViewController и один в методе applicationWillTerminate, который находится в моем AppDelegate.m. Журнал отображается только в консоли с той, что находится в AppDelegate.m. Поэтому, наконец, я не могу понять, как получить доступ к массиву напитков, который находится в моем MasterViewController из моего файла AppDelegate.m, поэтому я могу использовать метод applicationWillTerminate, который находится в моем приложении appDelegate.m, чтобы сохранить его на plist. Я напишу свой код appDelegate.m, который вызывает ошибку, потому что свойство drinks находится в MasterViewController.

AppDelegate.m (метод)

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [searchPaths objectAtIndex:0]; 
    NSString *writeableDBPath = [documentsDirectory stringByAppendingPathComponent:@"DrinkDirections.plist"]; 

    [self.drinks writeToFile:writeableDBPath atomically:YES]; //THIS LINE THROWS AN ERROR BECAUSE PROPERTY DRINKS IS ONLY ON MY MASTERVIEWCONTROLLER NOT MY AppDelegate 

} 

ответ

4

Прежде всего, как упоминалось выше, applicationDidEnterBackground:, вероятно, является лучшим местом для этого.Во-вторых, ваш контроллер просмотра не получит этот вызов на своем собственном: это вызов протокола UIApplicationDelegate, и ваш контроллер просмотра не является одним из них.

Что вы хотите сделать, так это заставить ваш контроллер просмотра получить уведомление UIApplicationDidEnterBackgroundNotification. The UIApplicationDelegate reference говорит:

Приложение также отправляет UIApplicationDidEnterBackgroundNotification уведомление вокруг то же время он вызывает этот метод, чтобы дать заинтересованным объектам шанс реагировать на переход.

Так что в вашем контроллере представления вы хотите сделать что-то вроде этого (предупреждение: напечатал этот код прямо в веб-страницы, не пытался скомпилировать):

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Register for notification. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(applicationDidEnterBackground:) 
           name:UIApplicationDidEnterBackgroundNotification 
          object:nil]; 
} 

- (void) viewDidUnload 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void) applicationDidEnterBackground:(NSNotification*)notification 
{ 
    // Do your plist saving here. 
} 
+0

Это именно то, что я пытался сделать изначально, прежде чем я решил попробовать отправить массив в мой файл делегата и использовать метод там , Это отлично сработало для меня. Спасибо за ваше время. –

0

«Для приложений, которые поддерживают выполнение фона, этот метод, как правило, не вызывается, когда пользователь завершает работу приложения, поскольку приложение просто переходит на задний план в этом случае»

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html

Короче говоря: ваше приложение никогда не «заканчивается», но положить в фоновом режиме и убит в фоновом режиме, если это необходимо.

Поскольку приложения являются «поддержки» фон по умолчанию, вы должны рассмотреть глядя на:

- (void)applicationDidEnterBackground:(UIApplication *)application 
+0

Я пытался использовать applicationDidEnterBackground : но снова он находится в моем файле AppDelegate.m, и я попытался реализовать этот метод в моем MasterViewController.m, но он не сработает. Я собирался попробовать использовать метод, который находится в моем AppDelegate.m, но у меня такая же проблема, что и раньше. Я не знаю, как получить доступ к массиву моих напитков, который находится в моем MasterViewController, из моего AppDelegate.m. –

0

Вы также можете попробовать сохранение .plist когда applicationDidEnterBackground называется. Согласно документации яблока here,

В прошивкой 4.0 и более поздних версий, этот метод вызывается вместо applicationWillTerminate: метод, когда пользователь завершает работу приложения, которое поддерживает выполнение фона. Вы должны использовать этот метод для выпуска общих ресурсов, сохранять данные пользователя, недействительные таймеры и хранить достаточную информацию о состоянии приложения для восстановления вашего приложения до его текущего состояния в случае его прекращения позже. Вы также должны отключить обновления пользовательского интерфейса вашего приложения и избегать использования некоторых типов общих системных ресурсов (таких как база данных контактов пользователя). Также настоятельно необходимо избегать использования OpenGL ES в фоновом режиме.

Я выделил соответствующие порции. Надеюсь это поможет!

Смежные вопросы