¿Segue a otro guión gráfico?

133

¿Es posible pasar de un guión gráfico a otro o incrustar un guión gráfico en un controlador de vista en otro guión gráfico? Necesito colocar un UITabBarControlleren un UINavigationController, y me gustaría mantenerlos agradables y separados.

Ry-
fuente
1
Mira esta respuesta stackoverflow.com/a/19702425/317928
vokilam
55
Gran pregunta Tener un guión gráfico es una pesadilla para proyectos basados ​​en equipo. Regularmente dividimos los proyectos en guiones gráficos por "flujo" (un guión gráfico para inicio de sesión, un guión gráfico para noticias y pantallas relacionadas, etc.). Ayuda a minimizar la cantidad de conflictos de fusión, que de otro modo ocurrirían cada vez que un desarrollador toca el guión gráfico.
Brian Sachetta
@BrianSachetta ¿Qué más haces? ¿Algún otro buen consejo similar para compartir?
Miel
Depende de la estructura de tu equipo. Si realmente quisiera, podría tener todas sus interfaces de usuario en archivos .xib separados. Así era antes de que existieran los guiones gráficos. Hay ventajas y desventajas de este enfoque. Lo bueno es que casi nunca tendrás conflictos con otros desarrolladores en el proyecto. La desventaja es que puede ser difícil ver que la aplicación fluya visualmente.
Brian Sachetta

Respuestas:

201

Sí, pero debes hacerlo mediante programación:

// 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];
lnafziger
fuente
11
Solo quiero mantener separados los guiones gráficos; ya están demasiado abarrotados.
Ry-
11
Al igual que los capítulos de un libro, veo la necesidad de múltiples guiones gráficos.
finneycanhelp
48
Cuando hay varios desarrolladores trabajando en la misma aplicación, se vuelve muy útil tener varios guiones gráficos porque resolver conflictos de control de versiones en el guión gráfico xml es bastante doloroso a veces.
Lee
14
En iOS 9 y Xcode 7, ahora se admiten referencias de guiones cruzados. :-)
Quinn Taylor
1
Vea la respuesta de milczi, ¡puede hacerlo ahora muy fácilmente en la interfaz de usuario!
Tim
117

A partir de Xcode 7, puede hacer esto gráficamente utilizando una referencia de guión gráfico:

referencia

Agregue Storyboard Reference a su storyboard. Crear segue entre ViewController y Storyboard Reference (Ctrl + arrastrar)

Luego llene estos campos.

ingrese la descripción de la imagen aquí

Donde "Tutorial" es el archivo "Tutorial.storyboard" y "MainTutorialController" es su campo "Storyboard ID" en ViewControllerSettings

milczi
fuente
1
Buena información, sin embargo, la pregunta está etiquetada ios5 por lo que esto no se aplica.
lnafziger
10
@Inafziger sí, pero esta pregunta aparece en la parte superior de los resultados de búsqueda para las personas que usan iOS 9
Brian Ogden
Esto está disponible desde XCode 7 en adelante. Ver más información en stackoverflow.com/questions/30772145/…
Simon Pickup
Esto funcionó, pero también necesito mantener la barra de navegación, se muestra sin la barra de navegación, ¿hay alguna forma de mantener una navegación y un botón para volver al historial, no importa de qué guión gráfico provenga?
Gil Beyruth
Esto funciona para mí en iOS 10. Noté que necesito una referencia de guión gráfico por segmento y no pude conectar varios segmentos a un punto de referencia.
Mark Reid
10

Realmente no puedes hacer segues manualmente porque UIStoryboardSegue es una clase abstracta. Debe subclasificarlo e implementarlo performpara que pueda hacer cualquier cosa. Realmente están destinados a ser creados en guiones gráficos. Sin embargo, puede empujar el controlador de vista manualmente, lo cual es una buena solución. La respuesta de lnafziger hace esto bien:

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

Sin embargo, una cosa a tener en cuenta es que has dicho que quieres mantener las cosas bonitas y separadas. La idea de los guiones gráficos es permitirle mantener las cosas separadas mientras realiza todo su trabajo de diseño en un solo lugar. Cada controlador de vista es agradable y está separado dentro del guión gráfico de los demás. La idea es mantener todo en un solo lugar. Simplemente colóquelo bien para que esté organizado, y estará listo para comenzar. No debe separarlo a menos que tenga una buena razón para hacerlo.

wbyoung
fuente
66
fusionar guiones gráficos no funciona muy bien, por lo que en un entorno de múltiples desarrolladores, podría ser interesante usar guiones gráficos separados. Además, el rendimiento puede ser bastante malo en grandes proyectos con un solo guión gráfico.
calimarkus
1
Usamos múltiples guiones gráficos, pero el punto es que realmente no puedes hacer eso y seguir entre ellos. Apple lo diseñó para que pudieras hacer todo en un solo lugar, por lo que la idea es usar solo uno (no es que no puedas). El rendimiento no debería ser un problema. El guión gráfico se compila en archivos plum separados para cada controlador de vista. Debería obtener un rendimiento muy bueno de los guiones gráficos. El rendimiento será tan bueno como si tuviera xib separados para cada controlador de vista.
wbyoung
3
En mi caso, el problema de rendimiento suele estar en Xcode ... La implementación actual de Apple del editor de guiones gráficos es débil.
Adam
1
Un Storyboard de 60 escenas tarda 13 segundos en abrirse en una Mac Pro 2014. He archivado un radar.
Robert Atkins
7

No debe colocar UITabBarControllers en un UINavigationController. Está pidiendo errores, como la autorrotación / descarga de vista incorrecta, etc., ya que Apple no admite este tipo de contención:

Sin embargo, cuando se combinan controladores de vista, el orden de contención es importante; solo ciertos arreglos son válidos. El orden de contención, de niño a padre, es el siguiente:

  • Controladores de vista de contenido y controladores de vista de contenedor que tienen límites flexibles (como el controlador de vista de página)
  • Controlador de vista de navegación
  • Controlador de barra de pestañas
  • Controlador de vista dividida
Danra
fuente
1
Estoy totalmente de acuerdo, y por múltiples razones. Poner un TabBarController dentro de un NavigationController no es una buena idea, porque los delegados no dispararían correctamente por las vistas contenidas en ellos, y el usuario final tendrá un tiempo terrible navegando por la interfaz. Les sería difícil volver al controlador que sale de la interfaz TabBar / Navigation. Al revés, está bien, un NavigationController dentro de un TabBarController. ¡Siempre es mejor no confundir al usuario final y escuchar las sugerencias de Apple!
Hubert Kunnemeyer
1
Y, sin embargo, la aplicación nativa de iPhone Music hace exactamente eso (parte "Now Playing").
Enzo Tran
FYI: la aplicación de música para iPhone no tiene TabbarController en la pantalla "Now playing".
sanjana
4

Aquí hay una versión rápida:

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

intentaste lo siguiente:

2 / haga clic para seleccionar su controlador de vista que está vinculado a su controlador de navegación y en el menú superior: editor -> incrustar en -> controlador de barra de pestañas

Nota: No lo probé porque estoy usando lo contrario: hacer aplicaciones de barra con pestañas y poner el controlador de navegación dentro).

moxy
fuente