Creando una transición programáticamente

Resuelto Tiago Veloso asked hace 54 años • 13 respuestas

Tengo un común UIViewControllerque todos mis UIViewsControllersextender para reutilizar algunas operaciones comunes.

Quiero configurar una transición en este "Común" UIViewControllerpara que todos los demás UIViewControllershereden.

Estoy tratando de descubrir cómo lo hago mediante programación.

Supongo que la pregunta también podría ser cómo configuro un seguepara todos mis UIViewControllerssin tener que entrar en el guión gráfico y hacerlos a mano.

Tiago Veloso avatar Jan 01 '70 08:01 Tiago Veloso
Aceptado

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.

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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.

SmileBot avatar Jun 09 '2013 18:06 SmileBot

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.

jonkroll avatar Mar 12 '2012 21:03 jonkroll

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];
Jean-Philippe Pellet avatar May 23 '2013 09:05 Jean-Philippe Pellet