Pergunta

Eu tenho um complexo iPad ver que eu conseguir por ter vários controladores de vista.Eu anteriormente (antes do iOS6/XCode 4.5) fez isso para alocar a meu ver controladores de código, e ligado a vários pontos de vista para os embora links para o modo de exibição mestre.

O que eu gostaria de fazer é usar o novo recipiente de vistas para incorporar a visão de controladores no arquivo de storyboard.Eu não parecem ser capazes de fazer um IBOutlet link para a visualização incorporada do controlador para o controlador mestre.

É possível fazer isso?Ou para recuperar o controlador incorporado através de uma etiqueta ou algo no código?

Esta questão é ESPECIFICAMENTE sobre o uso de recipiente de vista

Foi útil?

Solução

Não tenho certeza do que você quer dizer com "recuperar o controlador incorporado".Quando você deseja usar um controlador, você usa o método UistoryBoard InstantiSiTeViewControllerWithIdentifier:, usando o identificador que você dá ao controlador no IB.Você também pode usar o método do desempenho do desempenho: o método (que também instanciou o controlador de visualização).Você deve conferir o "Usando Exibir Controllers na seção App" nos documentos da Apple.Também faz referência ao fato de que os controladores de visualização de crianças são instanciados ao mesmo tempo que o controlador de contêineres.

Após a edição: Se você incorporar uma exibição de contêiner em outro controlador de visualização, esse controlador de visualização incorporado pode ser referenciado a partir do controlador contendo com self.childviewControllers (que será uma matriz, por isso, se há apenas um, você pode obtê-locom lastobject).

Outras dicas

Outra opção para alguns casos, é capturar o controlador incorporado usando -prepareForSegue:sender:.

Por exemplo, se eu tenho um UINavigationController inserida dentro de uma CustomContainerViewController, Eu posso citar a incorporar segue embedContentStack no storyboard e capturá-lo na CustomContainerViewController via

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"embedContentStack"]) {
        // can't assign the view controller from an embed segue via the storyboard, so capture here
        _contentStack = (UINavigationController *)segue.destinationViewController;
    }
}

Nota de Cautela

Antes de continuar a utilizar uma resposta para esta pergunta, você pode desejar para refletir se incorporado coisas que realmente precisa ser vista de controladores.

Por exemplo, se você está a incorporação de um UICollectionViewController subclasse, você poderia, em vez de incorporar um UICollectionView subclasse?Ou, melhor ainda, você poderia incorporar um UIView subclasse, que esconde a distância UICollectionView por trás de uma simples ViewModel?

No código base do eu estou trabalhando no momento, eu estou a incorporação de dois controladores de vista para outro controlador de visualização.Ambos podem facilmente ser simples pontos de vista em vez disso, e, em seguida, poderia ser mais facilmente acoplado no storyboard, sem esta confuso código.

Infelizmente, eles estão actualmente a visualizar controladores e eu não estou em posição de simplificá-los em simples pontos de vista agora, então isso terá que fazer.

Fundo

Eu estou usando a abordagem de pegar o embed segue em prepare(for segue:, sender:) como sugerido por Brincalhão Geek aqui.

Eu queria mostrar o swift que eu estou usando para isso, como parece ser bastante arrumado...

class EditionLandingViewController: UIViewController {
    fileprivate var titlesView: SectionTitlesViewController!
    fileprivate var sectionsView: SectionsViewController!
}

//MARK:-

extension EditionLandingViewController {
    private enum SegueId: String {
        case embedTitles
        case embedSections
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        guard
            let segueRawId = segue.identifier,
            let segueId = SegueId(rawValue: segueRawId)
            else { return }

        switch segueId {
        case .embedTitles:
            self.titlesView = segue.destination as! SectionTitlesViewController

        case .embedSections:
            self.sectionsView = segue.destination as! SectionsViewController
        }
    }
}

Discussão

Eu escolhi nome seguem como métodos de ação.

Usando um enum casos para atender identificadores significa que você tem o compilador e ferramentas no seu lado, de modo que é muito mais difícil obter um segue o nome errado.

Mantendo a retribuição identificações em uma private enum dentro do extension escopo parece apropriado, neste caso, como estes seguem não são necessários em qualquer outro lugar (elas não podem ser performed, por exemplo).

Eu estou usando implicitamente desembrulhou tipos para a exibição inserida controladores porque (no meu caso, de qualquer maneira) é um erro de lógica, se eles estão em falta.

Da mesma forma, eu também estou feliz a força do elenco do destino tipos de controlador.Mais uma vez, seria um erro de lógica, se estes tipos não são os mesmos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top