É possível verificar dentro da classe ViewController se ela é apresentada como controlador de visualização modal?
iphone
ios
view
controller
modal-dialog
morno
fonte
fonte
nil == nil
retornaYES
, e não é o resultado que queremos.Se você está procurando pelo iOS 6+, esta resposta está obsoleta e você deve verificar a resposta de Gabriele Petronella
Não há uma maneira legal de fazer isso, como uma propriedade ou método nativo do UIKit. O que você pode fazer é verificar vários aspectos do seu controlador para garantir que ele seja apresentado como modal.
Então, para verificar se o controlador atual (representado
self
no código abaixo) é apresentado de forma modal ou não, tenho a função abaixo ou em umaUIViewController
categoria, ou (caso seu projeto não necessite de outros controladores UIKit, comoUITableViewController
por exemplo) em um controlador de base do qual meus outros controladores herdamEDIT: Eu adicionei a última verificação para ver se um UITabBarController está sendo usado, e você apresenta outro UITabBarController como modal.
EDIT 2: adicionado cheque iOS 5+, onde
UIViewController
não respondeparentViewController
mais, maspresentingViewController
sim.EDITAR 3: criei uma essência para isso, apenas no caso de https://gist.github.com/3174081
fonte
modalViewController
propriedade está obsoleta a partir do iOS 6. A documentação sugere o usopresentedViewController
.NSLog(@"%@", self.navigationController.parentViewController)
impressões(null)
- você poderia explicar por quê? Meu ViewController está conectado ao controlador de visualização modal por meio do navController no storyboard..parentViewController
está obsoleto,.presentingViewController
deve ser usado em seu lugar.No iOS5 +, como você pode ver em Referência de classe UIViewController , você pode obtê-lo na propriedade "presentationViewController".
PresentViewController O controlador de visualização que apresentou este controlador de visualização. (somente leitura)
@property (nonatomic, readonly) UIViewController * apresentandoViewController
Discussão
Se o controlador de exibição que recebeu esta mensagem for apresentado por outro controlador de exibição, esta propriedade mantém o controlador de exibição que o está apresentando. Se o controlador de visualização não for apresentado, mas um de seus ancestrais estiver sendo apresentado, esta propriedade mantém o controlador de visualização apresentando o ancestral mais próximo. Se nem o controlador de visualização nem qualquer um de seus ancestrais estiverem sendo apresentados, essa propriedade será nula.
Disponibilidade
Disponível no iOS 5.0 e posterior.
Declarado em
UIViewController.h
fonte
presentingViewController
. Ele também funcionará em controladores de visualização de contêiner, visto que atravessa automaticamente os ancestrais.Se não houver, você pode definir uma propriedade para this (
presentedAsModal
) em sua subclasse UIViewController e configurá-laYES
antes de apresentar o ViewController como uma visualização modal.Você pode verificar esse valor em sua
viewWillAppear
substituição.Acredito que não haja uma propriedade oficial que defina como a vista é apresentada, mas nada impede que você crie a sua própria.
fonte
UINavigationController
como modal ... a menos que você crie um controlador de navegação personalizado apenas para adicionar esta propriedade. E depois disso, dentro dos controladores, você terá que continuar lançandoself.navigationController
para esta classe personalizada toda vez que precisar verificar se o controlador está apresentado como modalA resposta de Petronella não funciona se self.navigationController for apresentado modalmente, mas self não for igual a self.navigationController.viewControllers [0], nesse caso self é pressionado.
Aqui está como você pode resolver o problema.
E em Swift:
fonte
Isso deve funcionar.
fonte
UINavigationController
eUITabBarController
. Está funcionando muito bem até agoraMelhor maneira de verificar
fonte
Se você não precisa distinguir entre visualizações modais de tela cheia e visualizações não modais, que é o caso do meu projeto (eu estava lidando com um problema que ocorre apenas com folhas de formulário e folhas de página), você pode usar o método modalPresentationStyle propriedade de UIViewController:
fonte
Em Swift :
fonte
Em meu projeto, tenho um controlador de visualização (Detalhe) que pode ser apresentado modalmente (ao adicionar um novo item) ou com push (ao editar um existente) pelo controlador de visualização Master. Quando o usuário toca em [Concluído], o controlador de visualização de detalhes chama o método do controlador de visualização Mestre para notificar que está pronto para ser fechado. O Mestre deve determinar como o Detalhe é apresentado para saber como fechá-lo. É assim que eu faço isso:
fonte
Um hack como este pode funcionar.
No entanto, acho que minha resposta anterior é uma solução mais limpa.
fonte
O que funcionou para mim é o seguinte:
Pelo que testei, funciona para iOS7 e iOS8. Porém, não tentei no iOS6.
fonte
Eu olhei um pouco ao redor para encontrar a resposta certa para esta pergunta, e não consegui encontrar nenhuma que cobrisse todos os cenários possíveis. Eu escrevi essas poucas linhas de código que parecem fazer o trabalho. Você pode encontrar alguns comentários embutidos para descobrir o que foi verificado.
Espero que esta ajuda.
fonte
Aqui está minha versão modificada de @GabrielePetronella
isModal
, que funciona com controladores de visualização contidos no sentido de que sobe primeiro na hierarquia parentViewController. Também extraiu o código em várias linhas para que fique claro o que está fazendo.fonte