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