Como posso, no meu código de controlador de exibição, diferenciar entre:
- apresentado modalmente
- empurrado na pilha de navegação
Ambos presentingViewController
e isMovingToParentViewController
são YES
nos dois casos, portanto, não são muito úteis.
O que complica as coisas é que meu controlador de exibição pai às vezes é modal, no qual o controlador de exibição a ser verificado é pressionado.
Acontece que meu problema é que eu incorporo o meu HtmlViewController
em um UINavigationController
que é então apresentado. É por isso que minhas próprias tentativas e as boas respostas abaixo não estavam funcionando.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Acho melhor dizer ao meu controlador de exibição quando é modal, em vez de tentar determinar.
ios
objective-c
swift
uiviewcontroller
uinavigationcontroller
assuntos de significado
fonte
fonte
presentingViewController
está sempreYES
no meu caso; não ajuda.presentingViewController
retornaYES
para VC empurrado, quando há umUITabBarController
sendo definido como raiz. Então, não é adequado no meu caso.No Swift :
Adicione um sinalizador para testar se é um modal pelo tipo de classe:
fonte
var isModal: Bool {}
false
parâmetro nareturn
instrução faz?Você negligenciado um método:
isBeingPresented
.isBeingPresented
é verdadeiro quando o controlador de exibição está sendo apresentado e falso quando está sendo pressionado.fonte
isBeingPresented
éNO
. Mas agora vejo o motivo: estou incorporando meu controlador de exibição apresentado em umUINavigationController
e é esse que estou pressionando.p
, nãopo
ao imprimir um valor primitivo.po
é para imprimir objetos.isBeingPresented
- Este método retorna YES apenas quando chamado de dentro dos métodos viewWillAppear: e viewDidAppear:.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
eisMovingToParentViewController
são válidos apenas dentro das 4view[Will|Did][Disa|A]ppear
métodos.Swift 5
Aqui está a solução que resolve o problema mencionado nas respostas anteriores, quando
isModal()
retornatrue
se pressionadoUIViewController
estiver em umaUINavigationController
pilha apresentada .Isso funciona para mim até agora. Se algumas otimizações, por favor, compartilhe.
fonte
tabBarController?.presentingViewController is UITabBarController
? Importa se essepresentingViewController
também é um UITabBarController?isModal
retornarátrue
. Isso é pretendido?Para lidar com o caso de o atual controlador de exibição ser pressionado enquanto o controlador de navegação é apresentado de forma modal, adicionei algumas linhas de código para verificar se o atual controlador de exibição é o controlador raiz na pilha de navegação.
fonte
Swift 4
fonte
Rápido 5. Limpo e simples.
fonte
Como muitas pessoas sugerem aqui, que os métodos de "verificação" não funcionam bem para todos os casos, no meu projeto eu encontrei uma solução para gerenciar isso manualmente. O ponto é que geralmente gerenciamos a apresentação por conta própria - não é isso que acontece nos bastidores e precisamos fazer uma introspecção.
DEViewController.h
Arquivo:As apresentações agora podem ser gerenciadas desta maneira:
pressionado na pilha de navegação:
apresentado de forma modal com a navegação:
apresentado modalmente:
Além disso,
DEViewController
poderíamos adicionar um fallback para "verificar" se a propriedade mencionada acima é igual aSSViewControllerPresentationMethodUnspecified
:fonte
Supondo que todos os viewControllers que você apresenta modalmente sejam agrupados dentro de um novo navigationController (o que você sempre deve fazer de qualquer maneira), você pode adicionar essa propriedade ao seu VC.
fonte
Para detectar que o seu controlador foi pressionado ou não, use apenas o código abaixo em qualquer lugar que você desejar:
Espero que este código possa ajudar alguém ...
fonte
self.navigationController != nil
significaria que está em uma pilha de navegação.fonte
fonte
Se você estiver usando o ios 5.0 ou posterior, use este código
fonte
Swift 5
Esta extensão prática lida com mais alguns casos do que as respostas anteriores. Esses casos são VC (view controller) é o VC raiz da janela do aplicativo, o VC é adicionado como filho ao VC pai. Ele tenta retornar true somente se o viewcontroller for apresentado de forma modal.
Graças à resposta de Jonauz . Novamente, há espaço para mais otimizações. Por favor, discuta sobre o caso que precisa ser tratado na seção de comentários.
fonte
Para quem está se perguntando, como dizer ao ViewController que ele está sendo apresentado
se
A
está apresentando / pressionandoB
Definir um
enum
eproperty
emB
Agora em
A
controlador de exibição, digaB
se ele está sendo apresentado / enviado atribuindopresentationStyle
Uso no
B
View Controllerfonte
Isso permitirá que você saiba se o viewController é apresentado ou enviado por push
fonte