0

Задача: В моем приложении я представляю UIViewController с использованием модального сегмента в раскадровке. Этот viewController имеет UITableView, и пользователь может выбрать ячейку. Затем я увольняю этот viewController и возвращаюсь. То, что я хочу сделать, - это когда контроллер снова представлен, выделенная ячейка подсвечивается. Поэтому я решил сохранить выбранную ячейку indexPath в свойстве и в viewWillAppear установить выделенную ячейку. Но когда представлен viewController, его свойства равны нулю. Итак, мои вопросы:iOS: Как может модальный viewController запомнить его свойства?

Как модальный viewController помнит его свойства?

+1

Во второй раз, когда вы представляете его, это другой экземпляр контроллера вида. Представляющий контроллер может сохранять модальный контроллер и повторно представлять один и тот же экземпляр каждый раз. В качестве альтернативы, другой объект может запомнить, какие элементы были выбраны. Этот объект может быть вашей моделью данных или, что еще проще, свойством в контроллере представления. Решение о том, как его хранить, зависит от того, где и как эти контроллеры должны быть повторно использованы в вашем приложении. –

+0

@ Aaron Brager thanx man! Сделал то, что вы сказали и отлично работал! Ответьте, если вы хотите его принять – MrTourkos

ответ

0

Не можете ли вы сохранить индексный путь к пользовательским настройкам по умолчанию?

let index = NSIndexPath(index: 35) 
    NSUserDefaults.standardUserDefaults().setValue(index, forKey: "savedIndex") 


    //Then in your viewwillappear 
    if let savedIndex = NSUserDefaults.standardUserDefaults().valueForKey("savedIndex") as? NSIndexPath { 
     //set the highlighted cell 
    } 

Просто мысли ...

+0

Fyi, этот ответ в Swift, а вопрос задает Objective-C. – WMios

+0

Да, мой плохой ... Хорошо, что вы скопировали мой ответ и перевели его в Obj-C для плаката. – Ron

1

Основная проблема заключается вы смешиваете модели и вид контроллера обязанности.

Это ответственность модели за запоминание состояния приложения. Это обязанность диспетчера представлений связывать данные с представлениями и проверять ввод пользователя.

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

В вашем случае данные состояния имеют более длительный жизненный цикл, чем контроллер вида. Разбейте эти данные на модель, затем примените эту модель к контроллеру представления (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; 
} 
+0

Я не был достаточно аналитиком о том, что происходит в приложении. Пользователь выбирает ячейку, представляющую страну, которая фильтрует UITableView предыдущего ViewController. Должно ли это быть в модели? Я действительно новичок в iOS, и я еще не понимаю MVC! Спасибо! – MrTourkos

+0

Я добавил немного больше к моему ответу. –

1

Каждый раз, когда вы представляете модальный контроллер, это новый экземпляр. Если вы хотите, чтобы новый экземпляр запоминал свойства, которые вы сохраняете (например, indexPath), вы можете сохранить его в NSUserDefaults, чтобы вы могли просто повторно получить доступ ко всему, или вы могли бы просто представить один и тот же контроллер модального представления.

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

ИСПОЛЬЗОВАТЬ NSUserDefaults:

У вас есть свойство, называют его _indexPath

NSString *indexPathString = [NSString stringWithFormat: @"%@", _indexPath]; 
[[NSUserDefaults standardUserDefaults] setObject: indexPathString forKey: @"Index_Path"]; 

И чтобы получить indexPath просто сделать это:

-(void) viewWillAppear)

NSString *indexPathString = [[NSUserDefaults standardUserDefaults] objectForKey: @"Index_Path"]; 
// convert indexPathString to indexPath and save as _indexPath 
+1

Спасибо, что ответили, но я не думаю, что NSUserDefaults - это подходящее место для хранения таких вещей. Как я уже сказал, я действительно новый, поэтому, возможно, я ошибаюсь. Тонкс снова! – MrTourkos

+0

Я отредактировал свой ответ. Вы можете просто представлять один и тот же контроллер модального представления каждый раз, если вы не хотите использовать NSUserDefaults. – WMios

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