Как сохранить значения 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).

Этот подход относительно прост в реализации, но его недостатком является то, что второй контроллер представления сохраняется в памяти, даже когда он больше не нужен.

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

Другие вопросы по тегам