Uma Visualização de contêiner pode ser facilmente adicionada a um storyboard por meio do Editor de interface. Quando adicionada, uma Visualização de contêiner é uma visualização de espaço reservado, uma segue incorporada e um controlador de visualização (filho).
No entanto, não consigo encontrar uma maneira de adicionar um Container View programaticamente. Na verdade, não consigo nem encontrar uma classe chamada UIContainerView
ou assim.
Um nome para a classe de Container View é certamente um bom começo. Um guia completo incluindo a segue será muito apreciado.
Conheço o View Controller Programming Guide, mas não o considero igual ao que o Interface Builder faz para o Container Viewer. Por exemplo, quando as restrições são definidas corretamente, a visualização (filha) se adapta às mudanças de tamanho na Visualização do contêiner.
fonte
ViewController
ciclo de vida do embutido . OViewController
ciclo de vida do embutido pelo Interface Builder é normal, mas aquele adicionado programaticamente não temviewDidAppear
,viewWillAppear(_:)
nemviewWillDisappear
.viewWillAppear
eviewWillDisappear
são chamados no controlador de visualização filho, muito bem. Se você tiver um exemplo em que eles não estão, você deve esclarecer ou postar sua própria pergunta perguntando por que eles não são.Respostas:
Uma "visualização de contêiner" de storyboard é apenas um
UIView
objeto padrão . Não existe um tipo especial de "visualização de contêiner". Na verdade, se você olhar para a hierarquia de visualizações, verá que a "visualização do contêiner" é um padrãoUIView
:Para conseguir isso de forma programática, você emprega "visualizar contenção do controlador":
instantiateViewController(withIdentifier:)
o objeto storyboard.addChild
seu controlador de visualização pai.view
à sua hierarquia de visualização comaddSubview
(e também defina asframe
restrições ou conforme apropriado).didMove(toParent:)
método no controlador de visualização filho, passando a referência para o controlador de visualização pai.Consulte Implementing a Container View Controller no View Controller Programming Guide e a seção "Implementing a Container View Controller" da Referência de classe UIViewController .
Por exemplo, no Swift 4.2 pode ser parecido com:
Observe que o acima não adiciona realmente uma "visualização de contêiner" à hierarquia. Se você quiser fazer isso, você faria algo como:
Este último padrão é extremamente útil se alguma vez fizer a transição entre diferentes controladores de visualização filho e você só quiser ter certeza de que a visualização de um filho está no mesmo local e a visualização do filho anterior (ou seja, todas as restrições exclusivas para a colocação são ditadas pela visualização do contêiner, em vez de precisar reconstruir essas restrições todas as vezes). Mas se apenas executar a contenção de visualização simples, a necessidade dessa visualização de contêiner separada é menos atraente.
Nos exemplos acima, eu estou definindo
translatesAutosizingMaskIntoConstraints
parafalse
definir as restrições de mim mesmo. Você, obviamente, pode deixartranslatesAutosizingMaskIntoConstraints
comotrue
e definir tanto oframe
eoautosizingMask
para os pontos de vista que você adicionar, se você preferir.Veja as revisões anteriores desta resposta para versões de Swift 3 e Swift 2 .
fonte
ViewController
ciclo de vida do embutido . OViewController
ciclo de vida do embutido pelo Interface Builder é normal, mas aquele adicionado programaticamente não temviewDidAppear
,viewWillAppear(_:)
nemviewWillDisappear
.ViewController
deviewDidAppear
é chamado no de seu paiviewDidLoad
, em vez de durante o de seu paiviewDidAppear
viewDidAppear
, [mas] nem,viewWillAppear(_:)
nemviewWillDisappear
". Oswill
métodos de exibição são chamados corretamente em ambos os cenários. Deve-se chamardidMove(toParentViewController:_)
ao fazê-lo programaticamente, embora, ou eles não o farão. Quanto ao tempo de aparecimento. métodos, eles são chamados na mesma sequência de ambas as maneiras. O que difere, entretanto, é o tempo deviewDidLoad
, porque com embed, ele é carregado antesparent.viewDidLoad
, mas com programático, como seria de se esperar, isso acontece duranteparent.viewLoadLoad
.translatesAutoresizingMaskIntoConstraints = false
. Não sei por que é necessário ou por que faz as coisas funcionarem, mas obrigado por incluí-lo em sua resposta.@ Resposta de Rob no Swift 3:
fonte
Detalhes
Solução
Uso
Amostra completa
Resultados
fonte
tableViewController
um,viewController
mas não consigo definir o título do anterior. Não sei se é possível fazer isso. Eu postei esta pergunta . É legal da sua parte se você der uma olhada nisso.Aqui está meu código em swift 5.
}
Uso
Use a outra função de incorporação com controlador de visualização não storyboard.
fonte
removeFromParent
chamada impede, como você alteraria sua classe para permitir isso?