Как мой UIViewController может узнать, кто поместил его в стек? - PullRequest
1 голос
/ 22 июля 2011

Это дополнение к устаревшему приложению iPhone с архитектурой, уже определенной (несколько лет назад кем-то другим).

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

Это означает, что разрабатываемое мной представление является автономным и должно каким-то образом управлять своими состояниями с помощью информации из системы.

Далее, на каждом экране есть кнопка «Настройки», переводящая пользователя на панель настроек, которая помещается в стек навигации поверх представления «мой».Когда пользователь закрывает панель настроек, мое представление снова появляется в соответствии с обычной навигацией.

ОК, вот моя проблема:

Когда пользователь входит в мое представление из меню, я хочу, чтобы онобыть сброшен, чтобы все поля ввода были пустыми.

Если пользователь переходит на экран настроек и возвращается к моему экрану, я хочу, чтобы все предыдущие данные были сохранены, т. е. не сбрасывались в пустые поля.

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

Существует ли надежный, документированный и желательно простой способ узнать, следует ли мне сбросить поляпо этому сценарию?

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Можете ли вы проверить стек навигации, чтобы увидеть, находится ли страница настроек в стеке?

- (void)viewWillAppear:(BOOL)aAnimated
{
    [super viewWillAppear:aAnimated];

    NSArray* stack = [[self navigationController] viewControllers];

    UIViewController* last = [stack lastObject];
}
1 голос
/ 22 июля 2011

Предположительно viewDidDisappear вызывается, когда ваше представление по какой-то причине скрыто. Вы могли бы предположительно получить UIWindow и обработать цепочку представлений, чтобы найти, где находится ваше представление в цепочке (если оно вообще есть) и что скрывает его.

Нетривиально, хотя и такие вещи, которые, вероятно, должны быть "лабиринтными" по сравнению с надежными.

(хотя, если последовательно используется навигационный контроллер, это становится намного проще.)

0 голосов
/ 22 июля 2011

В рассматриваемом контроллере представления, как насчет того, чтобы настроить делегата.

id delegate;
@property (nonatomic, assign) id delegate;

для заголовка, затем синтезируйте в реализации.

Всякий раз, когда вы нажимаете на этот контроллер вида, установите self в качестве делегата от толкающего вида. Затем в этом контроллере представления вы можете выполнить проверку в viewDidLoad или viewDidAppear: (или там, где вы считаете, что это необходимо) с помощью чего-то вроде следующего:

if ([self.delegate isKindOfClass:[SomeClass class]]) {
    // now you can find which class sent to this view;
}

Это должно сработать, поэтому я надеюсь, что это поможет вам

РЕДАКТИРОВАТЬ: учитывая, что вы переключаете представления, не всегда используя навигационный контроллер, вышеупомянутое не будет действовать постоянно В этом случае вам, вероятно, лучше использовать внутреннее свойство, а также выход на панель настроек. Так что в этом контроллере представления вы захотите что-то вроде этого в шапке:

BOOL shouldReset;
@property (readwrite) BOOL shouldReset;

В вашем viewDidLoad вы захотите инициализировать это как shouldReset = YES. Вы должны также указать это в вашем viewDidDisappear:, поскольку это ваше поведение по умолчанию. Когда вы представляете панель настроек, дайте настройкам розетку для текущего контроллера вида, чтобы вы могли из настроек (при нажатии кнопки назад) установить [self.otherViewController setShouldReset:NO]. Затем в вашем viewDidAppear: для исходного контроллера представления, о котором идет речь, вы можете проверить, должен ли он сбросить свои поля или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...