Pregunta Uso de varios guiones gráficos en iOS


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.

Storyboard screenshot

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. First view controller

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

Aquí está la salida del simulador.

Simulator

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:


73
2017-11-28 14:57


origen


Respuestas:


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 storyboards 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

Ver también lo discutido aquí


78
2017-10-01 19:19



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.


44
2017-12-15 07:25



He examinado el RBStoryboardLink enfoque sugerido por Ruibarbo. 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.

IB screenshot


18
2017-10-31 09:15



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".


16
2018-04-24 08:49



A partir de Xcode 7 (y retrotraído a iOS8), ahora puede tener referencias de guiones gráficos. Fue mencionado en este WWDC 2015 sesión (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-> Refactorizar a Storyboard .... Dale un nombre y voila:

enter image description here

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).


9
2017-10-15 08:18



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.


7
2017-11-28 16:17



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].


2
2018-02-23 19:06



Xcode 8.2.1

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

relationship from TabBarController to Storyboard Reference

arrastre una conexión desde el UITabBarController a la referencia externa del guion gráfico, agréguela como una relación de "control de vista". 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 define el nombre y la imagen / s para la pestaña.

enter image description here

Atributos inspector cuando el Storyboard Reference está seleccionado.

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


2
2018-01-17 18:53



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

Paso 1 : Busque una Storyboard Reference en componentes (Referir captura de pantalla)

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

Paso 3: Proporcione el nuevo nombre e identificador del identificador del identificador del controlador de visualización inicial (consulte la captura de pantalla)

enter image description here

Construir y ejecutar Funcionará.


1
2018-05-23 05:07