objective c - que - ¿Llamar a la escena del guión gráfico programáticamente(sin necesidad de segue)?
storyboard que es (9)
Tengo una escena de guión gráfico modal que quiero que sea accesible a todas mis otras escenas. Crear una transición modal desde cada escena en mi guión crea un gran lío de cadenas que van a todas partes. ¿Hay alguna manera de dejar los segmentos y llamar a la escena programáticamente en su lugar?
Básicamente quiero hacer algo como esto:
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
[self presentModalViewController:myNewVC animated:YES];
excepto que en lugar de crear y presionar una clase de controlador de vista, quiero hacer una transición modal a una escena de guión gráfico "aislada" (no conectada con un segue).
Creo que con iOS7 se ha vuelto muy fácil implementarlo a través del storyboard
Actualmente estoy aprendiendo sobre las nuevas funciones en iOS7 y encontré esta solución simple, pero podría haber sido relevante incluso en versiones anteriores, no estoy seguro.
Primero necesitas conectar el VC que presenta con el VC objetivo (esa es la única conexión necesaria), luego dentro del inspector de atributos del guión gráfico elige el estilo para ser modal, en el inspector de identidad dale a tu VC un storyboardID y asegúrate de marcar el ''uso casilla de verificación storyboardID,
Si aún no está allí, agregue este método a su presentingVC:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
YourTargetVC * targetVC =
(YourTargetVC *)segue.destinationViewController;
if(nil != targetVC) {
//Do preparations here
}
}
Ahora, cuando desee mostrar su targetVC desde su presentationVC, puede usar:
[self performSegueWithIdentifier:(NSString *) sender:(id)];
donde el identificador es su storyboardID de viewController, y el remitente es la vista que activó la acción, este método invocará la escena de guiones gráficos, por lo que se [prepareForSegue: sender:]
método [prepareForSegue: sender:]
permitiéndole hacer las últimas modificaciones antes de que aparezca el targetViewController.
En el guión gráfico, proporcione a su controlador de vista un identificador (bajo el Inspector de atributos) y luego use el siguiente código para llevar adelante esa vista.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];
Llamar para navegar a otra clase
UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UINavigationController *navController = (UINavigationController *)window.rootViewController;
DumpFeed *dump = [storyboard instantiateViewControllerWithIdentifier:@"DumpFeed"];
dump.isPushed=YES;
dump.strUserId = appDelegate.strFriendid;
[navController pushViewController:dump animated:YES];
Nota: el método presentModalViewController: animated está en desuso en iOS 6.
El nuevo código debería decir:
NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[self presentViewController:controller animated:YES completion:nil];
Sí tu puedes. Haz algo como esto para tener acceso al CV, luego simplemente Modal Push it:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
Tengo un caso en el que quiero presentar un controlador de vista desde la parte principal de la aplicación, uno con ajustes y ayuda, etc. Para hacer esto, quiero que esté dentro de un controlador de navegación, como un pequeño complemento en el módulo que podemos llamar desde un UIBarButtonItem.
Ahora, esto puede ser para / en el guión gráfico actual, o para otro, no importa.
Quiero hacerlo de esta manera, porque aborrezco el potencial de espagueti de segue line en todo mi guión gráfico.
He aquí cómo hacerlo.
- (IBAction)displaySettings:(id)sender
{
LOG_SELECTOR() // google that for extra goodness
// FYI, this can be done using a different storyboard like so.
/*
NSString * storyboardName = @"MainStoryboard_iPhone"; // possibly use device idiom?
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
*/
// To push a new set of scenes with a new Navigation Controller, it is done like this:
UINavigationController *settingsNC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings Nav Controller"];
OBSettingsUIViewController *settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings root"];
[settingsNC pushViewController:settingsVC animated:NO];
[settingsNC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
// Present the view controller;
[self presentViewController:settingsNC animated:YES completion:NULL];
}
En los controladores de vista presentados (o en una subclase del Controlador de navegación), puede tener un UIBarButtonItem para descartar toda la jerarquía de controladores de vista presentada de esta manera:
- (IBAction)dismissThisVC:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
Espero que esto ayude a un montón de gente. Aclamaciones.
Versión de Heres Swift 3:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)
Simplemente llame a viewcontroller usando el controlador de navegación. Escriba este código en viewcontroller y configure viewcontroller en storyboad como se establece en la imagen.
ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
[self.navigationController pushViewController:vc animated:YES];