Как сохранить значения UIDatePicker и UITextField при переключении контроллеров представления?
У меня есть два контроллера просмотра.
View Controller #2 имеет UIDatePicker
и UITextField
,
Если я вернусь к View Controller #1, а затем вернусь к View Controller #2, UIDatePicker потерял свою предыдущую выбранную дату, а UITextField пусто.
Это было инициализировано следующим образом:
@property (retain, nonatomic) IBOutlet UIDatePicker *datepick;
Я добираюсь до второго View Controller с помощью Push Segue и возвращаюсь с помощью:
[self.navigationController popViewControllerAnimated:YES];
Как я могу 'СОХРАНИТЬ' дату UIDatePicker и значение UITextField, чтобы оно всегда было при возврате к этому View Controller?
Я искал и нашел мнения, гипотезы и предложения, но не нашел решений.
Спасибо.
1 ответ
Это происходит потому, что (если вы правильно управляете памятью), второй контроллер вида освобождается, когда вы его извлекаете (вернитесь к первому). Поэтому, когда вы хотите вернуться к нему, вы фактически создаете совершенно новый экземпляр со значениями по умолчанию.
Одним из решений было бы убедиться, что у вас есть надежная ссылка на контроллер представления 2 из контроллера представления 1. Добавьте свойство в первый контроллер представления:
@property (nonatomic, retain) SecondViewController *mySecondViewController;
Реализуем геттер:
- (SecondViewController *)mySecondViewController {
if (!mySecondViewController) {
mySecondVieWController = [[SecondViewController alloc] init...];
}
return mySecondViewController;
}
Тогда, когда вы хотите представить это:
[self.navigationController pushViewController:self.mySecondViewController animated:YES];
Первый раз, когда ты это называешь, mySecondViewController
все еще будет nil
таким образом, получатель инициализирует это. В следующий раз, когда вы вызываете метод получения, он просто возвращает тот же экземпляр.
Не забудьте выпустить контроллер вида в dealloc. И, кстати, рассмотрите возможность использования автоматического подсчета ссылок (ARC).
Этот подход относительно прост в реализации, но его недостатком является то, что второй контроллер представления сохраняется в памяти, даже когда он больше не нужен.
Другим способом было бы вернуть выбранную дату или текст в ваш первый контроллер представления (возможно, через пользовательский протокол делегирования), и в следующий раз, когда вы захотите представить второй контроллер представления, вы передадите ему эти значения, чтобы установить дату и текст,