Visualização dos controladores de visualização aninhada do iOS dentro da visualização do UIViewController?


88

É uma prática de programação tipicamente ruim no iOS ter uma visão do controlador de visão aninhada dentro da visão do UIViewController? Digamos, por exemplo, que eu quisesse algum tipo de elemento interativo que respondesse aos toques do usuário, mas ocupasse apenas 25% da tela.

Suponho que eu adicionaria este controlador de visualização aninhado ao meu UIViewController dizendo algo como:

[self.view addSubview: nestedViewController.view];

6
Aqui está um tutorial completo com muitas fotos !! stackoverflow.com/a/23403979/294884 Enjoy
Fattie

Respostas:


145

Não, este é geralmente um bom design, ajuda a manter seus controladores de visualização concisos. No entanto, você deve usar o padrão de contenção do controlador de visualização, dê uma olhada na documentação a seguir.

Implementando um controlador de visualização de contêiner

Isso é incrivelmente simples de configurar usando o Interface Builder com Storyboards também, dê uma olhada no Container View na biblioteca de objetos.

Aqui está um exemplo inventado em um Storyboard. Neste exemplo, você teria 4 controladores de visualização, um que contém os 3 contêineres e um para cada contêiner. Quando você apresenta o controlador mais à esquerda que tem todos os contêineres, o Storyboard irá inicializar e incorporar automaticamente os outros 3. Você pode acessar esses controladores de visualização filho através da childViewControllerspropriedade ou existe um método que você pode substituir prepareForSegue:sender:e capturar os controladores de visualização de destino a segue prestes a ser chamada. Este também é um bom ponto para passar propriedades para os controladores de visualização filho se algum for necessário.

insira a descrição da imagem aqui


40
como "diabos" você faz isso no storyboard ?! é uma pergunta básica .. Eu não sei a resposta para :) Suspiro - respondendo minha própria pergunta. Adicione um contêiner à cena. Dê forma. Em seguida, nos campos em branco do storyboard, faça um UIViewController. Em seguida, clique com o botão direito e arraste desse contêiner (na lista do Navigator ou na GUI) para o novo UIViewController. No pop-up, escolha viewDidLoad-embed para começar. Obrigado Chris! :)
Fattie

A propósito, o link está quebrado.
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed" Caramba: quem diria isso!
Drux de

Obrigado @ChrisWagner! Esta é uma peça crítica do quebra-cabeça para implementar a arquitetura MVVM e evitar o Massive View Controller / "MVC";)
Rob

54

Eu coloquei este código no controlador de visualização pai. Funciona muito bem para mim.

Obj C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Outra opção é usar IB e colocar a visualização do contêiner. UIViewController aparecerá automaticamente (XCode 9 neste caso): insira a descrição da imagem aqui


2
Sim! +1. Obrigado por incluir uma resposta sobre como fazer isso programaticamente :)
C. Tewalt

Acabei de arrastar e soltar a visualização do controlador de visualização filho para a lista de subvisualização pai.
dimpiax

5

Aqui está minha solução Swift 3 baseada na resposta do Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.