2012-02-12 5 views
169

nella mia app ho un pulsante che esegue una programmazione segue:Eseguire Segue programmazione e passare i parametri alla vista di destinazione

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

Vorrei sapere se c'è un modo per fare riferimento alla vista di destinazione e per passarlo alcuni parametri.

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

Avete qualche idea?

Grazie, yassa


UPDATE:

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

+44

Aggiungi l'aggiornamento come una risposta e lo accetto in modo che la gente sappia che questo è stato risposto :) – danielbeard

+0

Aggiungi risposta, commento per la notifica. – DanSkeel

+11

Dovresti contrassegnare la risposta [in basso] (http://stackoverflow.com/a/10783047/377384) come corretta, in modo che la gente sappia che è stata data una risposta. –

risposta

104

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

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

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 ad un altro controller della vista.

nel file .h della vista Trget:

@property(weak, nonatomic) NSObject* dataModel; 

nel file .m:

@synthesize dataModel; 

dataModel può essere string, int, o come in questo caso si tratta di un modello che contiene molti articoli

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

OR. ..

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

Capisco il problema di eseguire la segue in un posto e mantenere lo stato di inviare i parametri a prepararsi per segue.

Ho trovato un modo per farlo. Ho aggiunto una proprietà chiamata userInfoDict a ViewControllers utilizzando una categoria. e ho eseguito override anche con l'identificatore, in modo tale che Se il mittente è self (ovvero il controller stesso). Passerà questo userInfoDict al successivo ViewController.

Qui invece di passare l'intero UserInfoDict è possibile anche passare i parametri specifici, come mittente e override 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 si utilizza la nuova versione rapida.

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

     } 
}