Как использовать NSUserDefaults с AppDelegate - PullRequest
5 голосов
/ 17 марта 2012

Я пытаюсь использовать NSUserdefaults для сохранения некоторых данных из текстового поля, я хочу, чтобы они сохранялись при выходе из приложения и загружались при запуске приложения, однако я столкнулся со стеной.

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

  1. Импорт AppDelegate и перебор методов внутри моего ВК OR
  2. создать экземпляр моего VC в AppDelegate и позволить AppDelegate установить и получить текст моего UITextField - (Разве это не противоречит парадигме MVC?)

Любые предложения приветствуются

Большое спасибо за потраченное время

Ответы [ 4 ]

3 голосов
/ 17 марта 2012

Вместо того, чтобы сохранять текстовое поле в AppDelegate, сохраняйте текст.Я бы сделал следующее:

1) В AppDelegate.h:

@property (strong, nonatomic) NSString *textToBeSaved;

2) В AppDelegate.m читайте и пишите textToBeSaved в NSUserDefaults, когда ваше приложение запускается и завершается.При запуске:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.textToBeSaved = [defaults objectForKey:@"save_me"];

и до завершения:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:self.textToBeSaved forKey:@"save_me"];
BOOL success = [defaults synchronize];

3) В SomeViewController.m, который, естественно, владеет UITextField, в viewWillAppear:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
myTextField.text = appDelegate.textToBeSaved;

4) Когда вы устанавливаете textToBeSaved, зависит от вашего пользовательского интерфейса, но всякий раз, когда вы знаете, что текст готов (например, textFieldShouldReturn или shouldEndEditing), вы можете передать строку в AppDelegate:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.textToBeSaved = myTextField.text;

Если пользовательский интерфейс отсутствуетчтобы позволить пользователю принять текст, вы можете сохранить строку в (textField: shouldChangeCharactersInRange: replaceString).

2 голосов
/ 17 марта 2012

Как вы упомянули выше, у вас есть два варианта:

1-) Прямой доступ к ВК UITextField из AppDelegate applicationDidFinishLaunching и applicationWillTerminate методов.

Вкл. applicationDidFinishLaunching:

Чтение из NSUserDefaults, установка UITextField в ВК.

Вкл. applicationWillTerminate:

Чтение из UITextField в VC, установите NSUserDefaults и synchronize.

2) Создайте подходящие методы в VC для выполнения той же работы и вызывайте их из AppDelegate.

-(void)record
{
// Read from UITextField, set UserDefaults and synchonize.
}

-(void)restore
{
// Read from UserDefaults, set UITextField.
}
1 голос
/ 17 марта 2012

Я бы посоветовал вам просто зарегистрироваться на некоторые уведомления UIApplication в вашем подклассе и ответить на них соответствующим образом. Вот ссылка на документы UIApplication. Уведомления, на которые вы можете подписаться, перечислены в нижней части страницы.

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

Вот пример того, что вы можете сделать в своем подклассе:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         Selector:@selector(restore)
                                             name:UIApplicationDidFinishLaunchingNotification
                                          object :nil];

Не забудьте удалить себя и в качестве наблюдателя. Если вам не нравятся NSNotifications, есть много онлайн-уроков.

0 голосов
/ 17 марта 2012

Разумеется, разрешено, чтобы делегат приложения содержал ссылку на цепочку контроллера представления.Собственные примеры Apple и шаблоны приложений iOS часто помещают указатель на контроллер корневого представления в переменную экземпляра App Delegate.

Если цепочка контроллера представления не нарушена, одна из возможностей состоит в том, чтобы делегат приложения отправлял «cleanUpNow».сообщение для верхнего или корневого контроллера представления, и чтобы контроллеры представления передавали его по цепочке, при этом каждый контроллер представления очищал по мере необходимости, а затем повторно отправлял сообщение всем другим контроллерам, расположенным дальше по цепочке, для очистки.

Доступ непосредственно к другому контроллеру представления, вероятно, менее чист, чем отправка ему сообщения для очистки себя (запись в NSDefaults и т. Д.).Может быть, они все сообщают о центральном объекте контроллера «очистки», цель которого состоит в том, чтобы собрать все необходимое состояние и записать его в один связный блок.

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

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