Creando una transición programáticamente
Tengo un común UIViewController
que todos mis UIViewsControllers
extender para reutilizar algunas operaciones comunes.
Quiero configurar una transición en este "Común" UIViewController
para que todos los demás UIViewControllers
hereden.
Estoy tratando de descubrir cómo lo hago mediante programación.
Supongo que la pregunta también podría ser cómo configuro un segue
para todos mis UIViewControllers
sin tener que entrar en el guión gráfico y hacerlos a mano.
Pensé en agregar otra posibilidad. Una de las cosas que puede hacer es conectar dos escenas en un guión gráfico usando una transición que no está adjunta a una acción y luego activar la transición mediante programación dentro de su controlador de vista. La forma de hacer esto es arrastrar desde el ícono del propietario del archivo en la parte inferior de la escena del guión gráfico que es la escena siguiente y arrastrar hacia la escena de destino. Agregaré una imagen para ayudar a explicar.
Aparecerá una ventana emergente para "Segue manual". Elegí Push como tipo. Toca el pequeño cuadrado y asegúrate de estar en el inspector de atributos. Dale un identificador que usarás para referirte a él en el código.
Bien, a continuación voy a pasar a utilizar un elemento de botón de barra programático. En viewDidLoad o en otro lugar, crearé un elemento de botón en la barra de navegación con este código:
UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize"
style:UIBarButtonItemStyleDone
target:self
action:@selector(buttonizeButtonTap:)];
self.navigationItem.rightBarButtonItems = @[buttonizeButton];
Ok, observe que el selector es buttonizeButtonTap:. Así que escribe un método nulo para ese botón y dentro de ese método llamarás a la transición de esta manera:
-(void)buttonizeButtonTap:(id)sender{
[self performSegueWithIdentifier:@"Associate" sender:sender];
}
El parámetro del remitente es necesario para identificar el botón cuando se llama a prepareForSegue. prepareForSegue es el método de marco donde creará una instancia de su escena y le pasará los valores que necesitará para hacer su trabajo. Así es como se ve mi método:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"Associate"])
{
TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController];
translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController
translationQuizAssociateVC.contentID = self.contentID;
translationQuizAssociateVC.index = self.index;
translationQuizAssociateVC.content = self.content;
}
}
Lo probé y funciona.
Por definición, una transición no puede existir independientemente de un guión gráfico. Incluso está ahí en el nombre de la clase: UIStoryboardSegue
. Las transiciones no se crean mediante programación: es el tiempo de ejecución del guión gráfico el que las crea por usted. Normalmente puede llamar performSegueWithIdentifier:
al código de su controlador de vista, pero esto depende de tener una transición ya configurada en el guión gráfico para hacer referencia.
Sin embargo, lo que creo que está preguntando es cómo puede crear un método en su controlador de vista común (clase base) que pasará a un nuevo controlador de vista y será heredado por todas las clases derivadas. Podrías hacer esto creando un método como este en tu controlador de vista de clase base:
- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
y luego, en su clase derivada, llame a ese método cuando se haga clic en el botón apropiado o se seleccione la fila de la tabla o lo que sea.
He estado usando este código para crear una instancia de mi subclase de transición personalizada y ejecutarla mediante programación. Parece funcionar. ¿Hay algo malo con esto? Estoy desconcertado al leer todas las demás respuestas que dicen que no se puede hacer.
UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];