IBOutlet link para visualização incorporada do controlador
-
12-12-2019 - |
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
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;
}
}
Aqui está outro encadeamento sobre ele: Acessar o controlador de visualização do contêiner do pai iOS
Eles propõem manter uma referência em prepareforsegue ou procurar o viewController incorporado em self.childviewControllers
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 perform
ed, 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.