Ответ 1
hm, возможно, вы можете использовать self.isMovingToParentViewController
в viewWillAppear
, см. docs, если это NO
, то это означает, что текущий контроллер представления уже включен стек навигации.
Скажем, у меня есть UIViewController
A и B.
Пользователь переходит с A на B с помощью push-сегмента.
Чем пользователь нажимает кнопку "Назад" и переходит к "A".
Теперь вызывается viewWillAppear
из A. Могу ли я узнать в коде здесь, что я пришел с задней кнопки (navigationController popTo...
), а не по-другому? И без написания специального кода в контроллере B.
hm, возможно, вы можете использовать self.isMovingToParentViewController
в viewWillAppear
, см. docs, если это NO
, то это означает, что текущий контроллер представления уже включен стек навигации.
Мне нравится делать следующее: контроллер A:
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (_popping) {
_popping = false;
NSLog(@"BECAUSE OF POPPING");
} else {
NSLog(@"APPEARING ANOTHER WAY");
}
//keep stack size updated
_stackSize = self.navigationController.viewControllers.count;
....
}
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
_popping = self.navigationController.viewControllers.count > _stackSize;
....
}
Что вы делаете, так это отслеживание того, исчезает ли ваш контроллер вида (A), потому что контроллер вида (B) толкается или по другой причине. Затем (если вы не изменили порядок контроллера дочернего представления), он должен точно сказать вам, появляется ли (A) из-за поп-музыки на навигационном контроллере.
Добавьте свойство BOOL в UIViewController
A:
@property (nonatomic) BOOL alreadyAppeared;
Затем в вашем методе viewWillAppear:
добавьте:
if (!self.alreadyAppeared) {
self.alreadyAppeared = YES;
// Do here the stuff you wanted to do on first appear
}