Я изо всех сил пытаюсь найти хорошее решение этой проблемы. В -viewWillDisappear:
методе контроллера представления мне нужно найти способ определить, происходит ли это из-за того, что контроллер представления помещается в стек контроллера навигации, или из-за того, что контроллер представления исчезает из-за его выталкивания.
На данный момент я устанавливаю такие флаги, как, isShowingChildViewController
но это становится довольно сложно. Единственный способ, которым я могу обнаружить это, в -dealloc
методе.
ios
iphone
cocoa-touch
uiviewcontroller
uikit
Майкл Водопад
источник
источник
viewWillAppear
и может показаться, что независимо от того, обнаруживается ли контроллер представления нажатием или что-то над ним выталкивается, массив viewControllers одинаков в обоих направлениях! Любые идеи?viewDidLoad
как он вызывается только один раз! Хм, хитрый!![viewControllers containsObject:self]
вместо[viewControllers indexOfObject:self] == NSNotFound
? Выбор стиля?-isMovingFromParentViewController
Упомянутый ниже метод позволяет вам проверить, явно ли выскочило представление.Я думаю, что самый простой способ это:
Swift:
источник
Из документации Apple в UIViewController.h:
Так что да, единственный документированный способ сделать это заключается в следующем:
Версия Swift 3:
источник
Если вы просто хотите знать , является ли получение совало ваше мнение, я только что обнаружил , что
self.navigationController
находитсяnil
вviewDidDisappear
, когда он удаляется из стека контроллеров. Так что это простой альтернативный тест.(Это я обнаружил после того, как попробовал все виды других искажений. Я удивлен, что нет протокола контроллера навигации, чтобы зарегистрировать контроллер представления, чтобы получать уведомления о всплывающих окнах. Вы не можете использовать,
UINavigationControllerDelegate
потому что на самом деле это действительно работает.)источник
Swift 4
источник
В Свифте:
источник
Я нахожу документацию Apple об этом трудной для понимания. Это расширение помогает видеть состояния при каждой навигации.
источник
Этот вопрос довольно старый, но я увидел его случайно, поэтому я хочу опубликовать лучшие практики (afaik)
ты можешь просто сделать
источник
Это относится к iOS7 , не знаю, применимо ли это к любым другим. Из того, что я знаю,
viewDidDisappear
по мнению уже было совать. Это означает, что когда вы запросите,self.navigationController.viewControllers
вы получитеnil
. Так что просто проверьте, если это ноль.TL; DR
источник
Segues может быть очень эффективным способом решения этой проблемы в iOS 6+. Если вы указали конкретный идентификатор в Интерфейсном Разработчике, вы можете проверить его в
prepareForSegue
.источник
Спасибо @Bryan Генри, все еще работает в Swift 5
источник
Я предполагаю, что вы имеете в виду, что ваше представление перемещается вниз по стеку контроллера навигации путем нажатия нового представления, когда вы говорите, что помещено в стек. Я бы предложил использовать
viewDidUnload
метод для добавленияNSLog
оператора, чтобы записать что-то на консоль, чтобы вы могли видеть, что происходит, вы можете добавитьNSLog
кviewWillDissappeer
.источник
Вот категория для выполнения того же, что и в ответе sbrocket:
Заголовок:
Источник:
источник