No meu aplicativo, estou usando um controlador de navegação. Mais tarde, de alguma forma, estou usando presentViewController
para mostrar uma imagem ampliada. Também não estou usando um Storyboard ou uma ponta.
Estou recebendo esse erro apenas no iOS 7. Funciona bem no iOS 6 e versões anteriores:
A apresentação de controladores de vista em controladores de vista desanexada é desencorajada
Respostas:
Para evitar receber o aviso em uma navegação por push, você pode usar diretamente:
E então, no seu controlador de exibição modal, quando tudo estiver concluído, você pode simplesmente chamar:
[self dismissViewControllerAnimated:YES completion:nil];
fonte
self.navigationController
fez isso por mim.O motivo desse aviso é que eu estava apresentando um controlador de exibição em uma exibição pequena que não é de tamanho completo. Dada a seguir é a imagem do meu projeto. onde clique em quatro opção acima. O usuário navega para a visão diferente do controlador de visualização infantil (funciona como tabViewcontroller). Mas o childviewcontroller contém uma exibição de tamanho pequeno. Portanto, se apresentarmos uma visão do childviewcontroller, ele fornece esse aviso.
E para evitar isso, você pode apresentar uma visão sobre o pai do controlador de visualização infantil
fonte
Aguarde
viewDidAppear()
:Este erro também pode surgir se você estiver tentando apresentar o controlador de vista antes que a vista realmente apareça, por exemplo, apresentando vista no
viewWillAppear()
anterior. Tente apresentar outra visão depoisviewDidAppear()
ou dentro dela.fonte
viewDidLoad()
, pessoal! Eu cometi este erro tantas vezes ...No meu caso, eu tenho uma
sampleViewController
visualização adicionada como uma subvisão e, em seguida, tenta apresentar um popover a partir da visualizaçãosampleViewController
(aqui, emself
vez de umaUIViewController
instância):O caminho certo deve estar abaixo:
Btw, isso também funciona para o caso de apresentar uma popover de uma célula de tableview, você só precisa garantir que o controlador tableview também tenha sido adicionado como controlador de exibição filho.
fonte
[self addChildViewController:sampleViewController];
, agora eu adicionado este, obrigadoEu acho que o problema é que você não tem uma hierarquia de controlador de exibição adequada. Defina o rootviewcontroller do aplicativo e mostre novas visualizações pressionando ou apresentando novos controladores de visualização neles. Permita que cada controlador de visualização gerencie suas visualizações. Somente controladores de exibição de contêiner, como o tabbarviewcontroller, devem adicionar outras visualizações de controladores de exibição às suas próprias visualizações. Leia o guia de programação dos controladores de exibição para saber mais sobre como usar os controladores de exibição corretamente. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
fonte
Swift 3
Para quem se deparar com isso, aqui está a resposta rápida.
fonte
Eu tenho quase o mesmo problema. O motivo foi que tentei apresentar "alguns" controladores em outro e após a animação ser concluída, eu estava configurando o controlador apresentado como root. Após esta operação, todos os outros controladores apresentados me trazem o aviso: "A apresentação de controladores de exibição em controladores de exibição desanimada é desencorajada ". E eu resolvo esse aviso apenas configurando "alguns" controladores como root sem nenhuma apresentação no início.
Removido:
Faça como root sem nenhuma apresentação:
fonte
Uma das soluções para isso é se você tem um childviewcontroller Então você simplesmente apresenta oviewview no seu pai por
E para dispensar, use o mesmo controlador de dispensviewview.
Esta é a solução perfeita funciona para mim.
fonte
Use
[self.navigationController presentViewController:xxx animated:YES completion:nil]
no iOS 8.fonte
Experimente este código
fonte
Tente apresentar
TabBarController
se é umTabBarController
aplicativo baseado.A razão pode ser
self
sua filhaTabBarController
e você está tentando apresentar de aChildViewController
.fonte
Sim, também recebi a mesma mensagem de aviso ao exibir um controlador de alerta que estava em outra exibição. Mais tarde, evitei isso apresentando o controlador de alerta do controlador de exibição pai, como abaixo:
fonte
você precisa adicionar o controlador de exibição que apresentará o novo controlador como filho do controlador de exibição pai.
Digamos que você tenha o seu MainViewController, adicione um novo controlador chamado controllerA e, em seguida, deseje apresentar um novo controlador chamado controllerB do controllerA
você tem que escrever algo como isto:
e no controllerA você pode apresentar o novo controller sem avisos
fonte
No Swift 4.1 e no Xcode 9.4.1
A solução é
Se escrever assim, estou recebendo o mesmo erro
Estou recebendo o mesmo erro
A solução completa é
fonte
Certifique-se de ter um controlador de visualização raiz para começar. Você pode configurá-lo
didFinishLaunchingWithOptions
.fonte
Muitas razões para este aviso. O meu é porque eu tenho um segue conectado de um ViewController a outro que será apresentado de forma modal. Mas, o ViewController de que estou apresentando está sendo gerado dinamicamente por um PageViewController. É por isso que ele é desanexado no Storyboard. Meu aplicativo não falhará por causa disso; mas gostaria de silenciar o aviso.
fonte
Cheguei a esse segmento em que tenho uma barra de navegação personalizada e estava chamando um AlertViewController por meio dele.
Eu tive que adicioná-lo quando criança ao meu controlador de exibição principal. Então eu poderia ligar para apresentá-lo sem nenhum aviso.
Você deve adicionar seu
Zoomed Image View Controller
filho do ViewController principal.(por exemplo)
Em seguida, você poderá ligar para o seu ZoomedImageViewController
fonte
Muitas respostas estão certas.
Esse problema aconteceu comigo quando meu colega de trabalho adicionou um AViewController ao BViewController. De alguma forma, ele acabou de adicionar a visão do AViewController à visão do BViewController.
Corrigido por add bViewController.addChild (aViewController)
fonte
Depende se você deseja mostrar seu alerta ou algo semelhante em qualquer lugar do tipo UIViewController.
Você pode usar este exemplo de código:
fonte
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!