Правильный способ инициализировать состояние в целевом контроллере представления из перехода?

У меня есть приложение с простым шаблоном "детализации". Я представляю список элементов либо в режиме карты, либо в режиме списка. Нажав на один из них, вы перейдете к более подробному «редактированию» контроллера представления. Мой контроллер редактирования имеет

@property (assign, nonatomic) BOOL showMap;

И в методах установки/получения исходной реализации:

#pragma mark - Properties
- (BOOL) showMap {
    return self.viewModeSegments.selectedSegmentIndex == 1;
}

- (void) setShowMap: (BOOL) showMap {
    self.view; // had to add this, it's a hack
    self.viewModeSegments.selectedSegmentIndex = showMap ? 1 : 0;
}

Я установил это свойство в инициирующем контроллере с помощью:

#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString: @"ValveEditSegue"]) {
        ValveEditController* controller = segue.destinationViewController;
        controller.valve = self.selections.anyObject;
        controller.showMap = ShowMap;
    }
}

Что я обнаружил, так это то, что установщик showMap происходит до того, как view был заполнен, поэтому viewModeSegments все еще был nil. Я экспериментировал с хаком, показанным в сеттере, который заставляет доступ к self.view, чтобы убедиться, что он загружен. Но это кажется плохой идеей. Чего я не знаю, так это того, какой шаблон мне должен использовать вместо этого.

Я мог бы сделать showMap нормальным свойством с поддержкой, а затем отразить это состояние в виджете в viewDidLoad раз, но это кажется глупым иметь свойство/состояние только для этого одноразового эффекта, подобного батуту.


person Travis Griggs    schedule 07.07.2014    source источник


Ответы (2)


Это другой вариант на самом деле...

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

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

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

person Wain    schedule 07.07.2014

Я думаю, вы полностью понимаете проблему. Вы можете немного уменьшить хакерство, принудительно загрузив представление в файле from vc prepareForSegue...

(void)controller.view;

Но я думаю, что ответ, который вы должны принять, будет вашим собственным, используя обычное свойство. Я не думаю, что это глупо, так как режим по умолчанию двухрежимного vc является законным свойством. (подумайте о UIViewController -hidesBottomBarWhenPushed)

person danh    schedule 07.07.2014