Как я могу в моем коде контроллера представления различать:
- представлен модально
- помещен в стек навигации
Оба presentingViewController
и isMovingToParentViewController
являются YES
в обоих случаях, поэтому они не очень полезны.
Что усложняет ситуацию, так это то, что мой родительский контроллер представления иногда является модальным, на который нажимается проверяемый контроллер представления.
Оказывается, моя проблема в том, что я вставляю свой файл HtmlViewController
, UINavigationController
который затем представляется. Вот почему мои собственные попытки и приведенные ниже хорошие ответы не сработали.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Думаю, мне лучше сказать своему контроллеру представления, когда он модальный, вместо того, чтобы пытаться определить.
ios
objective-c
swift
uiviewcontroller
uinavigationcontroller
осмысленные вопросы
источник
источник
presentingViewController
всегдаYES
в моем случае; не помогает.presentingViewController
возвращаетсяYES
для нажатого VC, когдаUITabBarController
в качестве корневого установлен объект. Так что в моем случае не подходит.В Swift :
Добавьте флаг, чтобы проверить, является ли он модальным по типу класса:
источник
var isModal: Bool {}
false
параметр вreturn
заявлении?Вы упустили из виду один метод:
isBeingPresented
.isBeingPresented
имеет значение true, когда отображается контроллер представления, и false при нажатии.источник
isBeingPresented
естьNO
. Но теперь я вижу причину, я встраиваю представленный контроллер представления в aUINavigationController
, и это тот, который я нажимаю.p
, а неpo
при печати примитивного значения.po
предназначен для печати объектов.isBeingPresented
- Этот метод возвращает YES только при вызове из методов viewWillAppear: и viewDidAppear :.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
ИisMovingToParentViewController
действуют только в пределах 4 -хview[Will|Did][Disa|A]ppear
методов.Swift 5
Вот решение, которое решает проблему, упомянутую в предыдущих ответах, когда
isModal()
возвращается,true
если нажатиеUIViewController
находится в представленномUINavigationController
стеке.Пока это работает для меня. Если какие-то оптимизации, поделитесь пожалуйста.
источник
tabBarController?.presentingViewController is UITabBarController
? Имеет ли значение, если этоpresentingViewController
тоже UITabBarController?isModal
вернетсяtrue
. Это предназначено?Чтобы справиться со случаем, когда текущий контроллер представления нажат, когда контроллер навигации представлен модально, я добавил несколько строк кода, чтобы проверить, является ли текущий контроллер представления корневым контроллером в стеке навигации.
источник
Swift 4
источник
Swift 5. Чисто и просто.
источник
Как многие здесь предполагают, методы «проверки» работают не во всех случаях, в моем проекте я придумал решение, позволяющее управлять этим вручную. Дело в том, что мы обычно управляем презентацией самостоятельно - это не то, что происходит за кулисами, и мы должны заниматься самоанализом.
DEViewController.h
файл:Теперь презентациями можно было управлять следующим образом:
помещен в стек навигации:
представлены модально с навигацией:
представлены модально:
Кроме того,
DEViewController
мы могли бы добавить откат к «проверке», равно ли вышеупомянутое свойствоSSViewControllerPresentationMethodUnspecified
:источник
Предполагая, что все viewController, которые вы представляете модально, заключены в новый navigationController (что вы всегда должны делать в любом случае), вы можете добавить это свойство в свой VC.
источник
Чтобы обнаружить, что ваш контроллер нажат или нет, просто используйте приведенный ниже код в любом месте:
Надеюсь, этот код поможет кому угодно ...
источник
self.navigationController != nil
будет означать, что это в стеке навигации.источник
источник
Swift 5
Это удобное расширение обрабатывает немного больше случаев, чем предыдущие ответы. В этих случаях VC (контроллер представления) является корневым VC окна приложения, VC добавляется в качестве дочернего к родительскому VC. Он пытается вернуть true только в том случае, если viewcontroller представлен модально.
Спасибо за ответ Джонауза . Опять же, есть место для дополнительных оптимизаций. Обсудите, пожалуйста, дело, которое необходимо рассмотреть, в разделе комментариев.
источник
Если вы используете iOS 5.0 или более позднюю версию, используйте этот код
источник
Для тех, кому интересно, как сообщить ViewController, что он представлен
если
A
представляет / толкаетB
Определите
enum
иproperty
вB
Теперь в
A
контроллере просмотра укажите, отображаетсяB
ли он / отправляется, назначивpresentationStyle
Использование в
B
View Controllerисточник
Это позволит вам узнать, представлен ли viewController или нажата
источник