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.

yassassin
fonte
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.

caçador
fonte
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;
    }
}
user1723341
fonte
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
fonte
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.

karthik1729
fonte
0

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

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

        }
}
Pokotuz
fonte