Segue para outro storyboard?


133

É possível seguir de um storyboard para outro ou incorporar um storyboard em um controlador de exibição em outro storyboard? Eu preciso colocar um UITabBarControllerem um UINavigationControllere gostaria de mantê-los legais e separados.



5
Ótima pergunta. Ter um storyboard é um pesadelo para projetos baseados em equipe. Nós regularmente dividimos projetos em storyboards por "fluxo" (um storyboard para login, um storyboard para feed de notícias e telas relacionadas, etc.). Ajuda a minimizar o número de conflitos de mesclagem, que ocorreriam sempre que um desenvolvedor tocasse o storyboard.
Brian Sachetta

@BrianSachetta O que mais você faz? Alguma outra boa dica semelhante para compartilhar?
mel

Depende da estrutura da sua equipe. Se você realmente quisesse, poderia ter todas as suas interfaces de usuário em arquivos .xib separados. Era assim que era antes dos storyboards existirem. Existem pontos positivos e negativos nessa abordagem. A vantagem é que você quase nunca terá conflitos com outros desenvolvedores no projeto. A desvantagem é que pode ser difícil ver o aplicativo fluir visualmente.
Brian Sachetta

Respostas:


201

Sim, mas você deve fazer isso programaticamente:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

11
Eu realmente quero manter os storyboards separados; eles já estão muito confusos.
Ry-

11
Assim como os capítulos de um livro, vejo a necessidade de vários storyboards.
precisa saber é o seguinte

48
Quando você tem vários desenvolvedores trabalhando no mesmo aplicativo, torna-se muito útil ter vários storyboards, pois a resolução de conflitos de controle de versão no storyboard xml é bastante dolorosa às vezes.
12123 Lee

14
No iOS 9 e no Xcode 7, agora há suporte para referências cruzadas. :-)
Quinn Taylor

1
Veja a resposta de milczi, agora você pode fazer isso com muita facilidade na interface do usuário!
Tim

117

A partir do Xcode 7, você pode fazer isso graficamente usando uma Referência do Storyboard:

referência

Adicione Referência do Storyboard ao seu storyboard. Criar segue entre o ViewController e a referência do storyboard (ctrl + arraste)

Em seguida, preencha esses campos.

insira a descrição da imagem aqui

Onde "Tutorial" é o arquivo "Tutorial.storyboard" e "MainTutorialController" é o campo "ID do storyboard" em ViewControllerSettings


1
Boas informações, no entanto, a pergunta está marcada como ios5, portanto isso não se aplica.
Lnafziger

10
@Inafziger sim, mas esta pergunta aparece no topo dos resultados de pesquisa para pessoas que usam o iOS 9 #
Brian Ogden #

Está disponível no XCode 7 em diante. Veja mais informações em stackoverflow.com/questions/30772145/…
Simon Pickup

Isso funcionou, mas eu também preciso manter a barra de navegação, ela é exibida sem a barra de navegação. Existe alguma maneira de manter uma navegação e um botão para voltar ao histórico, não importa de que storyboard ele seja?
Gil Beyruth

Isso está funcionando para mim no iOS 10. Observei que preciso de uma referência de storyboard por segue e não consegui conectar várias seguidas a um ponto de referência.
Mark Reid

10

Você não pode realmente executar seguimentos manualmente porque UIStoryboardSegue é uma classe abstrata. Você precisa subclassificá-lo e implementá- performlo para que ele faça qualquer coisa. Eles realmente foram criados para serem criados em storyboards. Você pode enviar manualmente o controlador de exibição, o que é uma boa solução. A resposta de lnafziger faz isso bem:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Uma coisa a observar, porém, é que você disse que deseja manter as coisas agradáveis ​​e separadas. A idéia dos storyboards é permitir que você mantenha as coisas separadas enquanto realiza todo o seu trabalho de design em um só lugar. Cada controlador de exibição é agradável e separado no storyboard dos outros. A idéia é manter tudo em um só lugar. Apenas apresente-a de maneira organizada, e você estará pronto. Você não deve separá-lo, a menos que tenha realmente um bom motivo para fazê-lo.


6
mesclar storyboards não funciona muito bem; portanto, em um ambiente com vários desenvolvedores, pode ser interessante usar storyboards separados. Além disso, o desempenho pode ficar muito ruim em grandes projetos com um único storyboard.
calimarkus

1
Usamos vários storyboards, mas o ponto é que você realmente não pode fazer isso e segue entre eles. A Apple o projetou para que você pudesse fazer tudo em um só lugar; portanto, a idéia é usar apenas um (não que você não possa). O desempenho não deve ser um problema. O storyboard é compilado em arquivos de ponta separados para cada controlador de exibição. Você deve obter um desempenho muito bom dos storyboards. O desempenho será tão bom quanto se você tivesse xibs separados para cada controlador de exibição.
Wbyoung 14/03/12

3
No meu caso, o problema de desempenho geralmente está no Xcode ... A implementação atual da Apple do editor de storyboard é fraca.
10243 Adam

1
Um Storyboard de 60 cenas leva 13 segundos para abrir em um Mac Pro de 2014. Arquivei um radar.
Robert Atkins

7

Você não deve colocar UITabBarControllers em um UINavigationController. Ele está pedindo bugs, como autorotação incorreta / descarregamento de visualização etc., pois a Apple não suporta esse tipo de contenção:

Ao combinar controladores de vista, no entanto, a ordem de contenção é importante; apenas certas disposições são válidas. A ordem de contenção, de filho para pai, é a seguinte:

  • Controladores de exibição de conteúdo e controladores de exibição de contêiner que possuem limites flexíveis (como o controlador de exibição de página)
  • Controlador de exibição de navegação
  • Controlador da barra de guias
  • Controlador de exibição de divisão

1
Eu concordo totalmente e por várias razões. Colocar um TabBarController dentro de um NavigationController não é uma boa idéia, porque os delegados não disparariam corretamente para as visualizações contidas neles, e o usuário final terá um tempo terrível navegando na interface. Eles teriam dificuldade em voltar ao controlador que sai da interface TabBar / Navigation. O contrário é OK, um NavigationController dentro de um TabBarController. É sempre melhor não confundir o usuário final e ouvir as sugestões da Apple!
Hubert Kunnemeyer 14/03/12

1
E, no entanto, o aplicativo nativo do iPhone Music faz exatamente isso (parte "Em reprodução").
Enzo Tran

FYI: o aplicativo de música para iPhone não tem o TabbarController na tela "Em reprodução".
sanjana

4

Aqui está uma versão rápida:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

-1

você tentou o seguinte:

2 / clique para selecionar o seu controlador de exibição que está vinculado ao seu controlador de navegação e no menu superior: editor -> embutido -> controlador da barra de guias

Nota: Não testei porque estou usando o oposto: criando aplicativos com barras com guias e colocando o controlador de navegação dentro).

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.