2014-01-08 1 views
18

Скажите, что у меня есть UIViewController A и B. Пользователь переходит с A на B с помощью push-сегмента. Чем пользователь нажимает кнопку возврата и приходит к A.Могу ли я узнать, что увидит, что он был вызван после нажатия кнопки навигации (кнопка возврата)?

Сейчас viewWillAppear A называется. Могу ли я узнать в коде здесь, что я пришел с обратной кнопкой (navigationController popTo...), а не по-другому? И без написания специального кода в контроллере B.

+4

Возможный дубликат. [Определить, был ли отображаемый вид нажатым или нажал кнопку «Назад» в панели навигации] (http://stackoverflow.com/questions/20849171/determine-if-view-that-appears-was-pushed- или-come-from-back-button-in-navigation) – rmaddy

ответ

2

Добавить свойство 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 
} 
+2

Но диспетчер представлений может отображаться также на панели вкладок, например, (он уже активирован, но не вызван кнопкой «назад») – adsurbum

+0

@adsurbum Я использовал делегата для этого случая в мое приложение. –

+0

Это, кажется, лучший вариант для отклонения диспетчера модального представления (я не хочу, чтобы 'viewWillAppear' вызывался). Добавление этого bool исправило это. – PaulRBerg

23

гм, может быть, вы можете использовать self.isMovingToParentViewController в viewWillAppear см docs, если NO, то это означает, что текущий контроллер представления уже находится в стеке навигации.

+0

Я пробовал. Это не подходит. Похоже, что нет решения без написания чего-то в контроллере B view. – adsurbum

+0

Да, это сработало для меня !! if (self.isMovingToParentViewController) { // Делать что-то только в первый раз, а не на задней кнопке } – Phamer

+2

Этот ответ неверен. Если диспетчер представлений находится под тем, который был выбит, его 'isMovingToParentViewController' всегда' false' при вызове из 'viewWillAppear'. – Eric

5

Я хотел бы сделать следующий вид контроллера 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) из-за поп-музыки на навигационном контроллере.

+0

Действительно хороший подход. Благодаря! –

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