trait human guidelines guide developer classes apple adaptive ios user-interface ios5 xcode4.2 uistoryboard

human - Uso de varios guiones gráficos en iOS



size classes xcode 9 (9)

Xcode 8.2.1

Puede hacer referencia a un controlador de vista en un guión gráfico externo.

arrastre una conexión desde el UITabBarController a la Referencia del UITabBarController gráfico externo, agréguela como una relación de "ver controladores". En el guión gráfico principal, se muestra como "Artículo / cuadrado", pero en el guión gráfico externo debe agregar un UITabBarItem y definir el nombre y las imágenes de la pestaña.

Atribuye al inspector cuando se selecciona la Storyboard Reference del Storyboard Reference .

También deberá darle al controlador externo una "ID del Storyboard" en su guión gráfico (no se muestra aquí) , y hacer referencia a su nombre en la referencia.

Mi objetivo es crear una aplicación con pestañas, luego la vista de cada una de las pestañas se construye en guiones gráficos separados.

Mi mainstoryboard es una vista de pestaña.

Luego creo un guión gráfico secundario (guión gráfico n. ° 2) con 2 controladores de vista. El primer controlador de vista (también marcado como inicial) tiene un botón y segue (modal) a la segunda vista.

Logré cargar la vista subclasificando y reemplazando loadView del guión gráfico # 2.

Aquí está la salida del simulador.

Al hacer clic en el botón "hacer clic en mí", obtengo un EXC_BAD_ACCESS . La transición no funciona, parece que el segundo guión gráfico no se está cargando por completo.

¿Alguien ha intentado hacer esto antes y hacerlo funcionar? Hay un video de youtube de SkillMaster.net pero no demuestra si un segue funciona en el guión gráfico secundario. el video está aquí: http://youtu.be/D4_twoYvB4M

Gracias por cualquier aporte y ayuda!

Capturas de pantalla:


A partir de Xcode 7 (y retrotraído a iOS8), ahora puede tener referencias de guiones gráficos. Se mencionó en esta sesión de la WWDC 2015 (comienza a hablar de ellos alrededor de la primera hora). Básicamente, todo lo que tenía que hacer era seleccionar ViewController''s que desea mover a un storyboard separado, y hacer clic en Editor-> Refactor en Storyboard .... Dale un nombre y voila:

Tenga en cuenta que si tiene VC que se mueven al nuevo guión gráfico, y no se referencian fuera de él (lo que debería ser), debe eliminar sus referencias de main.storyboard (relajarán que permanecerán en el guión gráfico recién creado; borrando solo referencias a ellos).


Descubrí que si tiene un segue con nombre en un segundo guión gráfico que desea usar en una llamada para realizarSegueWithIdenitfier: debe establecer el campo "ID del guion gráfico" en la pestaña "Identidad" del ViewController de origen.

Por ejemplo, si le dio un VC llamado "ViewController1" con un segue llamado "segue1" a otro VC, establezca el "ID Storyboard" de "ViewController1" a lo que sea (digamos "viewC1" o algo) y luego en ViewController1.m puede use [self performSegueWithIdentifier: @ "segue1" sender: self].


Desde uno de mis archivos XIB estoy navegando en una parte más complicada de la GUI, y para esta parte estoy usando un Storyboard. Entonces, un botón en mi XIB navegará al guión gráfico. El código que tengo para esto es:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardIdentifier" bundle:nil]; UIViewController* myStoryBoardInitialViewController = [storyboard instantiateInitialViewController]; [self.navigationController pushViewController:myStoryBoardInitialViewController animated:YES];

Esto empujará con éxito mi StoryBoard a la vista. El código anterior se llama desde una acción de botones "Touch Up Inside".


El OP editó su pregunta para incluir la respuesta:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"HelpStoryboard" bundle:nil]; UIViewController* initialHelpView = [storyboard instantiateInitialViewController]; initialHelpView.modalPresentationStyle = UIModalPresentationFormSheet; [self presentModalViewController:initialHelpView animated:YES];

Por supuesto, desde donde llame esto es significativo, porque puede tener 2 guiones gráficos y su vista en la memoria. Probablemente sea mejor si llama a este código desde fuera de los controladores de vista del otro guión gráfico.


Estos son los mejores artículos que he visto en múltiples guiones gráficos.

No solo este tipo te dice cómo crear un nuevo guión gráfico en el código, él

  • recomienda múltiples guiones gráficos en la práctica (código más modular)
  • discute cuándo usar xibs vs storyboards (xibs hold views, storboards se basan en controladores)
  • proporciona una clase para enlazar guiones gráficos con segues en github

Tenga en cuenta que este último punto es importante porque la desventaja clave de varios guiones gráficos es que normalmente no puede vincularlos con los segues, pero robs library lo permite con un poco de fudge

También vea el discutido here


He examinado el enfoque de RBStoryboardLink sugerido por Rhubarb. Esta implementación sustituye a las propiedades del controlador de vista que se ve impar. Creo que he encontrado la manera de evitar esto. Aquí está el proyecto de demostración .

Controladores de navegación

Los controladores de navegación podrían simplemente establecer un controlador de vista referenciado como raíz. La implementación de dicho controlador de vista puede verse así:

@interface ExternNavigationController : UINavigationController @property (strong, nonatomic) NSString *storyboardName; @property (strong, nonatomic) NSString *sceneIdentifier; @end @implementation ExternNavigationController - (void)awakeFromNib { NSAssert(self.storyboardName, @"storyboardName is required"); UIStoryboard *storyboard = [UIStoryboard storyboardWithName:self.storyboardName bundle:nil]; UIViewController *vc = self.sceneIdentifier ? [storyboard instantiateViewControllerWithIdentifier:self.sceneIdentifier] : [storyboard instantiateInitialViewController]; self.viewControllers = @[vc]; } @end

Ver controladores

Los problemas comienzan cuando desea presionar un controlador de vista definido en un guión gráfico externo. Este es el caso cuando las propiedades son copiadas. En lugar de esto, podemos implementar un segue personalizado que sustituirá un controlador de destino falso por uno real del guión gráfico externo.

@interface ExternStoryboardSegue : UIStoryboardSegue @end @implementation ExternStoryboardSegue - (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(ExternViewController *)destination { NSAssert(destination.storyboardName, @"storyboardName is required"); UIStoryboard *storyboard = [UIStoryboard storyboardWithName:destination.storyboardName bundle:nil]; UIViewController *vc = destination.sceneIdentifier ? [storyboard instantiateViewControllerWithIdentifier:destination.sceneIdentifier] : [storyboard instantiateInitialViewController]; return [super initWithIdentifier:identifier source:source destination:vc]; } - (void)perform { [[self.sourceViewController navigationController] pushViewController:self.destinationViewController animated:YES]; } @end

ExternViewController se usa como marcador de posición y contiene los requisitos para las propiedades de sustitución (storyboardName y sceneIdentifier).

@interface ExternViewController : UIViewController @property (strong, nonatomic) NSString *storyboardName; @property (strong, nonatomic) NSString *sceneIdentifier; @end @implementation ExternViewController @end

Necesitamos establecer estas propiedades y clase personalizada para el controlador de vista marcador de posición. Y también enlace el controlador de vista con ExternStoryboardSegue.


Los documentos de Apple dicen que puede tener múltiples guiones gráficos. Lamentablemente, no entran en detalles sobre cómo hacerlo. Como ya descubriste, Interface Builder no te ayudará, por lo que tendrás que hacerlo en código. Funciona muy parecido a cargar XIB:

[UIStoryboard storyboardWithName:@”MyNewStoryboard” bundle:myBundle]

Habiendo dicho eso, si no "quieres un storyboard grande / hinchado" como dijiste en tu comentario, entonces los XIB realmente son el camino a seguir. Esa ''grandeza'' es el beneficio: todas las transiciones entre VCs se presentan en un solo lugar. Tener múltiples guiones gráficos es en realidad para que pueda soportar múltiples flujos diferentes y no relacionados a través de su aplicación: por ejemplo, un guión gráfico para un flujo de configuración complejo y otro para el flujo de usuario principal.


Siga los pasos a continuación para lograr esta tarea:

Paso 1 : Busque una Storyboard Reference en los componentes (consulte la captura de pantalla)

Paso 2 : selecciona una nueva referencia del guión gráfico. (Referir captura de pantalla)

Paso 3 : Proporcione el nuevo nombre del guión gráfico y el identificador del identificador del controlador de vista inicial (consulte la captura de pantalla)

Construir y ejecutar Funcionará.