objective-c uiviewcontroller storyboard

objective c - Guión gráfico e inicio personalizado.



objective-c uiviewcontroller (3)

Recientemente intenté trabajar con MainStoryboard.storyboard dentro de Xcode y hasta ahora va bastante bien y me pregunto por qué nunca lo he usado antes. Mientras jugaba con un código me topé con un obstáculo y no sé cómo resolverlo.

Cuando asigno e inicie un nuevo ViewController (con un inicio personalizado declarado en la clase ViewControllers) haría algo como esto:

ViewController *myViewController = [[ViewController alloc] initWithMyCustomData:myCustomData];

Entonces después de eso pude hacer algo como:

[self presentViewController:myViewController animated:YES completion:nil];

Cuando trabajo con un guión gráfico, aprendí que cambiar a un ViewController independiente requiere un identificador.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; ViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; [self presentViewController:myViewController animated:YES completion:nil];

¿Cómo puedo seguir usando mi inicialización personalizada para myViewController mientras uso un guión gráfico?

¿Está bien hacer algo como esto?

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; ViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; myViewController.customData = myCustomData; [self presentViewController:myViewController animated:YES completion:nil]; //MyViewController.m - (id) initWithMyCustomData:(NSString *) data { if (self = [super init]) { iVarData = data; } return self; }


Mi version:

- (instancetype)initWithData (NSArray *)someData { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; if(self) { //default initialization } return self; }

... un inicializador;)


Puede crear una instancia de viewcontroller en el método -init.

- (instancetype)init { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; if(self) { //default initialization } return self; }

y en su método de inicio personalizado

- (instancetype)initWithImages:(NSArray *)images { self = [self init]; if(self) { self.images = images; } return self; }


Simplemente crearía un método que cargue los datos personalizados.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; [myViewController loadCustomData:myCustomData]; [self presentViewController:myViewController animated:YES completion:nil];

Si todo lo que hace su método initWithCustomData es establecer una variable de instancia, solo debe configurarla manualmente (no se requieren entradas personalizadas ni métodos adicionales):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; myViewController.iVarData = myCustomData; [self presentViewController:myViewController animated:YES completion:nil];