Основная проблема заключается вы смешиваете модели и вид контроллера обязанности.
Это ответственность модели за запоминание состояния приложения. Это обязанность диспетчера представлений связывать данные с представлениями и проверять ввод пользователя.
Проблема в том, что все обманывают. Когда у вас есть временные изменения состояния в контроллере представления, обычно нет необходимости прерывать это в модели, потому что контроллер представления и данные состояния имеют один и тот же жизненный цикл.
В вашем случае данные состояния имеют более длительный жизненный цикл, чем контроллер вида. Разбейте эти данные на модель, затем примените эту модель к контроллеру представления (singleton, прочитанный из постоянного хранилища, примененный в segue, ...: есть много способов сделать это).
С помощью небольшой информации, которую вы предоставили, я могу представить, как это можно осуществить.
Имейте модель, которая содержит массивы allItems
, currentItems
, countries
. Есть currentCountry
собственности. Переопределить -setCurrentCountry:
для восстановления currentItems
.
- (void)setCurrentCountry:(MyCountryModel *)currentCountry
{
_currentCountry = currentCountry;
self.currentItems = [self filterAllItemsByCountry:currentCountry];
}
Контроллер представления элементов будет содержать экземпляр модели. Когда контроллер просмотра стран будет нажат, модель может быть передана вдоль сегмента. Контроллер просмотра стран будет использовать countries
в качестве источника данных.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = …
MyCountryModel *country = self.model.countries[indexPath.row];
cell.selected = country == self.model.currentCountry;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCountryModel *country = self.model.countries[indexPath.row];
self.model.currentCountry = country;
}
Во второй раз, когда вы представляете его, это другой экземпляр контроллера вида. Представляющий контроллер может сохранять модальный контроллер и повторно представлять один и тот же экземпляр каждый раз. В качестве альтернативы, другой объект может запомнить, какие элементы были выбраны. Этот объект может быть вашей моделью данных или, что еще проще, свойством в контроллере представления. Решение о том, как его хранить, зависит от того, где и как эти контроллеры должны быть повторно использованы в вашем приложении. –
@ Aaron Brager thanx man! Сделал то, что вы сказали и отлично работал! Ответьте, если вы хотите его принять – MrTourkos