ios - perform - Creando un segue programáticamente
swift button segue (13)
Tengo un UIViewController
común que todos mis UIViewsControllers
extienden para reutilizar algunas operaciones comunes.
Quiero configurar un segmento en este UIViewController
"Común" para que todos los demás UIViewControllers
hereden.
Estoy tratando de averiguar cómo hago eso programáticamente.
Supongo que la pregunta también podría ser cómo establecer un segue
para todos mis UIViewControllers
sin entrar en el panel de cuentos y hacerlos a mano.
Aquí está el ejemplo del código para Creating a segue programmatically
:
class ViewController: UIViewController {
...
// 1. Define the Segue
private var commonSegue: UIStoryboardSegue!
...
override func viewDidLoad() {
...
// 2. Initialize the Segue
self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) {
self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self)
}
...
}
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// 4. Prepare to perform the Segue
if self.commonSegue == segue {
...
}
...
}
...
func actionFunction() {
// 3. Perform the Segue
self.prepare(for: self.commonSegue, sender: self)
self.commonSegue.perform()
}
...
}
Bueno, puede crear y también puede subclasificar el UIStoryBoardSegue. La subclase se utiliza principalmente para dar animación de transición personalizada.
Puedes ver el video de wwdc 2011 introduciendo StoryBoard. Está disponible en youtube también.
En primer lugar, suponga que tiene dos vistas diferentes en el guión gráfico y desea navegar de una pantalla a otra, así que siga estos pasos:
1). Defina todas sus vistas con el archivo de clase y también la identificación del guión gráfico en el inspector de identidad.
2). Asegúrese de agregar un controlador de navegación a la primera vista. Selecciónelo en el Guión gráfico y luego en Editor> Incrustar en> Controlador de navegación
3). En su primera clase, importe el "secondClass.h"
#import "ViewController.h
#import "secondController.h"
4). Agregue este comando en el IBAction que tiene que realizar el segue
secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.navigationController pushViewController:next animated:YES];
5). @"second"
es la clase de controlador de @"second"
vista, id de guión gráfico.
He estado usando este código para crear una instancia de mi subclase segue personalizada y ejecutarlo mediante programación. Parece funcionar. ¿Algo malo con esto? Estoy desconcertado, leyendo todas las otras respuestas diciendo 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];
Los Segues del guión gráfico no se deben crear fuera del guión gráfico. Tendrá que conectarlo, a pesar de los inconvenientes.
UIStoryboardSegue Reference claramente establece:
No creas objetos segue directamente. En cambio, el tiempo de ejecución del guión gráfico los crea cuando debe realizar un segue entre dos controladores de vista. Aún puede iniciar un segmento mediante programación utilizando el método performSegueWithIdentifier: sender: de UIViewController si lo desea. Puede hacerlo para iniciar un segmento desde una fuente que se agregó mediante programación y, por lo tanto, no está disponible en Interface Builder.
Aún puede programar que el guión gráfico presente un controlador de vista usando un segmento usando pushViewController:animated:
o pushViewController:animated:
calls, pero necesitará una instancia del guión gráfico.
Puede llamar al método de clase de UIStoryboard
para obtener un guión gráfico con un paquete nulo para el paquete principal.
storyboardWithName:bundle:
Me gustaría añadir una aclaración ...
Un malentendido común, de hecho uno que tuve durante algún tiempo, es que el método prepareForSegue:sender:
desencadena un segue del guión gráfico. No lo es. Se realizará un segue del guión gráfico, independientemente de si ha implementado un prepareForSegue:sender:
para ese controlador de vista (a partir de).
Aprendí esto de las excelentes conferencias de iTunes de Paul Hegarty. Mis disculpas pero lamentablemente no puedo recordar qué conferencia.
Si conecta un Segue entre dos controladores de vista en un guión gráfico, pero no implementa un prepareForSegue:sender:
el Segue seguirá dependiendo del controlador de vista de destino. Sin embargo, seguirá a ese controlador de vista sin estar preparado.
Espero que esto ayude.
Para los controladores que se encuentran en el guión gráfico.
jhilgert00 es esto lo que estabas buscando?
-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];
}
O...
[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
Pensé en añadir otra posibilidad. Una de las cosas que puede hacer es conectar dos escenas en un guión gráfico utilizando un segmento que no está adjuntado a una acción, y luego activar mediante programación el segmento dentro de su controlador de vista. La forma de hacerlo es que debe arrastrar desde el icono del propietario del archivo en la parte inferior de la escena del guión gráfico que es la escena de segueing, y arrastrar hacia la escena de destino. Voy a lanzar una imagen para ayudar a explicar.
Aparecerá una ventana emergente para "Segue manual". Elegí Push como el tipo. Toque en el cuadro pequeño y asegúrese de que está en el inspector de atributos. Déle un identificador que usará para referirse a él en el código.
Ok, a continuación voy a continuar usando un elemento del botón de la barra programática. Con 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, note que el selector es buttonizeButtonTap :. Así que escribe un método vacío para ese botón y dentro de ese método llamarás a segue así:
-(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 en el que creará una instancia de su escena y le pasará los valores que necesite para realizar 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;
}
}
Ok, acabo de probarlo y funciona. Espero que te ayude.
Por definición, un segmento no puede existir realmente independientemente de un guión gráfico. Incluso está ahí en el nombre de la clase: UIStoryboardSegue
. No creas segues programáticamente, es el tiempo de ejecución del guión gráfico el que los crea por ti. Normalmente puede llamar a performSegueWithIdentifier:
en el código de su controlador de vista, pero esto se basa en tener un segmento ya configurado en el guión gráfico como referencia.
Sin embargo, creo que está preguntando cómo puede crear un método en su controlador de vista común (clase base) que hará la transición a un nuevo controlador de vista y que todas las clases derivadas lo heredarán. Puede hacer esto creando un método como este para su 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 cuando se seleccione la fila de la tabla o lo que sea.
Realicé ingeniería inversa e hice una (re) implementación de código abierto de los segmentos de UIStoryboard: https://github.com/acoomans/Segway
Con esa biblioteca, puedes definir los segmentos programáticamente (sin ningún guión gráfico).
Espero que pueda ayudar.
Supongo que esto está respondido y aceptado, pero me gustaría agregarle algunos detalles más.
Lo que hice para resolver un problema en el que presentaría una vista de inicio de sesión como primera pantalla y luego quise pasar a la aplicación si el inicio de sesión era correcto. Creé el segmento del controlador de vista de inicio de sesión al controlador de vista raíz y le asigné un identificador como "myidentifier".
Luego, después de verificar todo el código de inicio de sesión si el inicio de sesión fue correcto, llamaría
[self performSegueWithIdentifier: @"myidentifier" sender: self];
Mi mayor malentendido fue que traté de poner el seguro en un botón y de alguna forma interrumpir el segmento una vez que se encontró.
Tienes que vincular tu código al UIStoryboard
que estás usando. Asegúrese de ingresar a YourViewController en su UIStoryboard
, haga clic en el borde que lo rodea y, a continuación, establezca su campo de identifier
en una NSString
que llama en su código.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
YourViewController *yourViewController =
(YourViewController *)
[storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];
Un par de problemas, en realidad:
Primero, en ese proyecto que cargó para nosotros, segue no lleva el identificador "segue1":
sin identificador
Debes completar ese identificador si aún no lo has hecho.
En segundo lugar, a medida que pasa de la vista de tabla a la vista de tabla, está llamando a initWithNibName para crear un controlador de vista. Realmente desea utilizar instantiateViewControllerWithIdentifier.