Esegui Segue a livello di codice e passa i parametri alla vista di destinazione


174

nella mia app ho un pulsante che esegue un seguito a livello di codice:

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

Vorrei sapere se esiste un modo per fare riferimento alla vista di destinazione e passargli alcuni parametri.

So che nel prepareForSeguemetodo, posso fare riferimento ad esso con:, myDestinationViewController *vc = [segue destinationViewController];ma non so come eseguire questo segue a livello di codice.

Hai qualche idea?

Grazie Yassa


AGGIORNARE:

Mi dispiace per questa domanda !!! Ho semplicemente scoperto che, anche se il seguito è invocato a livello di codice, il prepareForSeguemetodo viene chiamato comunque e quindi è possibile passare i parametri nello stesso modo consueto.


44
Aggiungi l'aggiornamento come risposta e accettalo in modo che le persone sappiano che è stata data una risposta :)
danielbeard,

Aggiungi risposta, commento per notifica.
DanSkeel,

11
Dovresti contrassegnare la risposta di seguito come corretta, in modo che le persone sappiano che è stata data una risposta.
lindon fox,

Risposte:


107

La risposta è semplicemente che non fa alcuna differenza sul modo in cui viene attivato il seguito.

Il prepareForSegue:sender:metodo viene chiamato in ogni caso ed è qui che si passa attraverso i parametri.


3
Questo mi disturba ancora - questo significa che devo innescare segue in un posto, dove ho i dati che voglio inviare come parametri ben isolati da qualsiasi altra cosa, ma per aggiungere quei dati in un posto completamente diverso - il PrepForSegue, dove non so nulla dei dati che devono essere passati. Significa che devo creare uno stato con quei dati in questione nel contesto condiviso da due diverse funzioni (una che scatena segue, l'altra che prepara). Non voglio sporcare lo stato quando tutto ciò che serve è aprire una nuova vista con alcuni dati ...
NeverwinterMoon,

Utilizzare il mittente per passare il contesto necessario per configurare il VC di destinazione
trapper

Supponevo che passare il payload nel mittente fosse un anti-schema. Dovrebbe contenere solo le informazioni su chi ha innescato il seguito, non i dati che la cosa che ha innescato il seguito intendeva passare oltre.
NeverwinterMoon,

Dai documenti ufficiali sul mittente: "Questo oggetto è reso disponibile a scopo informativo durante il seguito effettivo".
NeverwinterMoon,

1
Sì, non passare un payload effettivo, passare il contesto, ad esempio quale cella / pulsante / indice / etc ha attivato il seguito.
Trapper

90

Vecchia domanda ma ecco il codice su come fare quello che stai chiedendo. In questo caso, sto passando i dati da una cella selezionata in una vista tabella a un altro controller vista.

nel file .h della vista trget:

@property(weak, nonatomic)  NSObject* dataModel;

nel file .m:

@synthesize dataModel;

dataModelpuò essere string, into come in questo caso è un modello che contiene molti elementi

- (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;
    }
}

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"
            }
        }
    }

0

Comprendo il problema di eseguire il segue in un unico posto e mantenere lo stato per inviare i parametri in preparazione per segue.

Ho trovato un modo per farlo. Ho aggiunto una proprietà chiamata userInfoDict a ViewControllers usando una categoria. e ho ignorato l'esecuzione segue anche con l'identificatore, in modo tale che se il mittente è autonomo (indica il controller stesso). Passerà questo UserInfoDict al ViewController successivo.

Qui invece di passare l'intero UserInfoDict puoi anche passare i parametri specifici, come mittente e sovrascrivere di conseguenza.

1 cosa che devi tenere a mente. non dimenticare di chiamare il metodo super nel tuo metodo performSegue.


0

Nel caso in cui usi una nuova versione rapida.

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

        }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.