Executar Segue programaticamente e passar parâmetros para a visualização de destino


174

no meu aplicativo, eu tenho um botão que executa um programaticamente:

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

Gostaria de saber se existe uma maneira de referenciar a exibição de destino e passar alguns parâmetros.

Eu sei que no prepareForSeguemétodo, posso me referir a ele com:, myDestinationViewController *vc = [segue destinationViewController];mas não sei como executar isso segue programaticamente.

Você tem alguma ideia?

Obrigado yassa


ATUALIZAR:

Sinto muito por esta pergunta !!! Simplesmente descobri que, mesmo que o segue seja chamado programaticamente, o prepareForSeguemétodo é chamado assim mesmo e, portanto, é possível passar parâmetros da mesma maneira usual.


44
Adicione a atualização como uma resposta e aceite-a para que as pessoas saibam que isso foi respondido :) #
3111 danielbeard

Adicione resposta, comente para notificação.
DanSkeel 28/05

11
Você deve marcar a resposta abaixo como correta, para que as pessoas saibam que ela foi respondida.
Lindon fox 6/09/12

Respostas:


107

A resposta é simplesmente que não faz diferença como a sequência é acionada.

O prepareForSegue:sender:método é chamado em qualquer caso e é aqui que você passa seus parâmetros.


3
Isso ainda me incomoda - isso significa que tenho que acionar segue em um só lugar, onde tenho os dados que quero enviar como parâmetros bem isolados de qualquer outra coisa, mas para adicionar esses dados em um local completamente diferente - o prepareForSegue, onde não sabe nada sobre os dados que precisam ser passados. Ou seja, eu tenho que criar um estado com esses dados em questão no contexto compartilhado por duas funções diferentes (uma desencadeia segue, a outra - preparando). Eu não quero sujar o estado quando tudo necessidade I é abrir uma nova visão com alguns dados ...
NeverwinterMoon

Use remetente para passar contexto necessário para configurar o destino VC
caçador

Eu assumi que a carga útil passada no remetente é um antipadrão. Ele deve conter apenas as informações sobre quem acionou o segue, não os dados que a coisa que acionou o segue pretendia passar adiante.
NeverwinterMoon

Dos documentos oficiais sobre o remetente: "Este objeto é disponibilizado para fins informativos durante as etapas reais".
NeverwinterMoon

1
Sim, não passe uma carga útil real, passe o contexto, como qual célula / botão / índice / etc acionou o segue.
Trapper

90

Pergunta antiga, mas aqui está o código sobre como fazer o que você está perguntando. Nesse caso, estou passando dados de uma célula selecionada em uma visualização de tabela para outro controlador de visualização.

no arquivo .h da visualização trget:

@property(weak, nonatomic)  NSObject* dataModel;

no arquivo .m:

@synthesize dataModel;

dataModelpode ser string, intou, nesse caso, é um modelo que contém muitos itens

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

OU...

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

Eu entendo o problema de executar as segue em um só lugar e manter o estado para enviar parâmetros em preparação para segue.

Eu descobri uma maneira de fazer isso. Adicionei uma propriedade chamada userInfoDict a ViewControllers usando uma categoria. e eu substituí executar executar segue com identificador também, de tal maneira que Se o remetente for auto (significa o próprio controlador). Ele passará esse userInfoDict para o próximo ViewController.

Aqui, em vez de passar o UserInfoDict inteiro, você também pode passar os parâmetros específicos, como remetente e substituir de acordo.

Uma coisa que você precisa ter em mente. não esqueça de chamar super método no seu método performSegue.


0

Caso você use uma nova versão rápida.

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

        }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.