Realice Segue mediante programación y pase parámetros a la vista de destino

174

en mi aplicación tengo un botón que realiza una segue programáticamente:

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

Me gustaría saber si hay una manera de hacer referencia a la vista de destino y pasarle algunos parámetros.

Sé que en el prepareForSeguemétodo, puedo referirme a él con:, myDestinationViewController *vc = [segue destinationViewController];pero no sé cómo ejecutar esto segue programáticamente.

¿Tienes alguna idea?

Gracias yassa


ACTUALIZAR:

Lo siento por esta pregunta !!! Simplemente descubrí que, incluso si el segue se invoca mediante programación, el prepareForSeguemétodo se llama de todos modos y, por lo tanto, es posible pasar parámetros de la misma manera habitual.

yassassin
fuente
44
Agregue la actualización como respuesta y acéptela para que la gente sepa que esto ha sido respondido :)
danielbeard
Añadir respuesta, comentario para notificación.
DanSkeel
11
Debe marcar la respuesta a continuación como correcta, para que las personas sepan que se ha respondido.
lindon fox

Respuestas:

107

La respuesta es simplemente que no importa cómo se desencadena el segue.

El prepareForSegue:sender:método se llama en cualquier caso y aquí es donde pasa sus parámetros.

trampero
fuente
3
Esto todavía me molesta, esto significa que tengo que activar segue en un lugar, donde tengo los datos que quiero enviar como parámetros muy bien aislados de cualquier otra cosa, pero para agregar esos datos en un lugar completamente diferente: prepareForSegue, donde No sé nada acerca de los datos necesarios para pasar. Es decir, tengo que crear un estado con esos datos en cuestión en el contexto compartido por dos funciones diferentes (una que desencadena segue, la otra - preparación). No quiero ensuciar el estado cuando todo lo que necesito es abrir una nueva vista con algunos datos ...
NeverwinterMoon
Use el remitente para pasar el contexto necesario para configurar el VC de destino
trampero
Supuse que pasar la carga útil en el remitente es un antipatrón. Solo debe contener la información sobre quién activó el segue, no los datos que la cosa que activó el segue pretendía transmitir más.
NeverwinterMoon
De los documentos oficiales sobre el remitente: "Este objeto se pone a disposición con fines informativos durante el seguimiento real".
NeverwinterMoon
1
Sí, no pase una carga útil real, pase el contexto, como qué celda / botón / índice / etc. desencadenó la segue.
trampero
90

Antigua pregunta, pero aquí está el código sobre cómo hacer lo que está pidiendo. En este caso, estoy pasando datos de una celda seleccionada en una vista de tabla a otro controlador de vista.

en el archivo .h de la vista trget:

@property(weak, nonatomic)  NSObject* dataModel;

en el archivo .m:

@synthesize dataModel;

dataModelpuede ser string, into como en este caso, es un modelo que contiene muchos elementos

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

O...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}
usuario1723341
fuente
3

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

Swift 3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }
Jonas Deichelmann
fuente
0

Entiendo el problema de realizar el segue en un lugar y mantener el estado para enviar parámetros en preparación para el segue.

Descubrí una forma de hacer esto. Agregué una propiedad llamada userInfoDict a ViewControllers usando una categoría. y he anulado realizar segue con identificador también, de tal manera que si el remitente es uno mismo (significa el controlador mismo). Pasará este userInfoDict al siguiente ViewController.

Aquí, en lugar de pasar el UserInfoDict completo, también puede pasar los parámetros específicos, como remitente y anular en consecuencia.

1 cosa que debes tener en cuenta. no olvides llamar al método super en tu método performSegue.

karthik1729
fuente
0

En caso de que use una nueva versión rápida.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

        }
}
Pokotuz
fuente