no iOS6, notei a nova exibição de contêiner, mas não sei ao certo como acessar seu controlador a partir da exibição que o contém.
Cenário:
Desejo acessar os rótulos no controlador de exibição de alerta no controlador de exibição que abriga a exibição de contêiner.
Há uma sequência entre eles, posso usar isso?
ios
objective-c
swift
uiviewcontroller
uicontainerview
Adam Waite
fonte
fonte
Respostas:
Sim, você pode usar as instruções para acessar o controlador de exibição filho (e suas visualizações e subvisões). Atribua um identificador a segue (como
alertview_embed
), usando o inspetor de Atributos no Storyboard. Em seguida, faça com que o controlador de visualização pai (aquele que abriga a visualização de contêiner) implemente um método como este:fonte
Você pode fazer isso simplesmente com
self.childViewControllers.lastObject
(supondo que você tenha apenas um filho, caso contrário, useobjectAtIndex:
).fonte
childViewControllers
"muito cedo" #para programação rápida
você pode escrever assim
fonte
A
prepareForSegue
abordagem funciona, mas depende da sequência mágica do identificador segue. Talvez haja uma maneira melhor.Se você conhece a classe do VC que procura, pode fazer isso muito bem com uma propriedade computada:
Isso depende
childViewControllers
. Embora eu concorde que poderia ser frágil confiar na primeira, nomear a classe que você procura faz com que isso pareça bastante sólido.fonte
return childViewControllers.filter { $0 is CamperVanViewController }.first
em um único forrochildViewControllers.flatMap({ $0 as? CamperVanViewController }).first
que acho um pouco melhor, pois lança e se livra de nada.first(where:)
.childViewControllers.first(where: { $0 is CamperVanViewController })
Uma resposta atualizada para o Swift 3, usando uma propriedade computada:
Isso apenas itera a lista de filhos até atingir a primeira correspondência.
fonte
self.childViewControllers
é mais relevante quando você precisa de controle dos pais. Por exemplo, se o controlador filho for uma exibição de tabela e você desejar recarregá-lo com força ou alterar uma propriedade por meio de um toque no botão ou qualquer outro evento no Parent View Controller, você poderá fazê-lo acessando a instância do ChildViewController e não através do prepareForSegue. Ambos têm suas aplicações de maneiras diferentes.fonte
Existe outra maneira de usar a instrução switch de Swift no tipo de controlador de exibição:
fonte
Eu uso o código como:
fonte
Caso alguém esteja procurando pelo Swift 3.0 ,
viewController1 , viewController2 e assim por diante estarão acessíveis.
fonte
Com genérico você pode fazer algumas coisas doces. Aqui está uma extensão do Array:
Você pode fazer isso no seu viewController:
fonte
você pode escrever assim
fonte