Выполнить Segue программно и передать параметры в представление назначения - PullRequest
173 голосов
/ 12 февраля 2012

в моем приложении есть кнопка, которая выполняет передачу программно:

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

Я хотел бы знать, есть ли способ ссылаться на представление назначения и передавать ему некоторые параметры.

Я знаю, что в методе prepareForSegue я могу ссылаться на него с помощью: myDestinationViewController *vc = [segue destinationViewController];, но я не знаю, как это выполнить программно.

У вас есть какие-нибудь идеи?

Спасибо, ясса


ОБНОВЛЕНИЕ:

Извините за этот вопрос !!!Я просто обнаружил, что, даже если segue вызывается программно, метод prepareForSegue вызывается в любом случае, и поэтому можно передавать параметры таким же обычным способом.

Ответы [ 5 ]

105 голосов
/ 28 мая 2012

Ответ прост: просто не имеет значения, как запускается переход.

В любом случае вызывается метод prepareForSegue:sender:, и здесь вы передаете свои параметры.

90 голосов
/ 21 декабря 2012

Старый вопрос, но вот код о том, как сделать то, что вы спрашиваете.В этом случае я передаю данные из выбранной ячейки в табличном представлении в другой контроллер представления.

в файле .h представления trget:

@property(weak, nonatomic)  NSObject* dataModel;

в файле .m:

@synthesize dataModel;

dataModel может быть string, int, или, как в данном случае, это модель, которая содержит много элементов

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

ИЛИ ...

- (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;
    }
}
2 голосов
/ 12 марта 2018

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 голосов
/ 08 марта 2018

В случае, если вы используете новую версию Swift.

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

        }
}
0 голосов
/ 06 сентября 2013

Я понимаю проблему выполнения перехода в одном месте и поддержания состояния для отправки параметров при подготовке к переходу.

Я нашел способ сделать это.Я добавил свойство userInfoDict в ViewControllers, используя категорию.и я переопределил выполнение segue с идентификатором тоже таким образом, что если отправитель сам (значит, сам контроллер).Он передаст этот userInfoDict следующему ViewController.

Здесь вместо передачи всего UserInfoDict вы также можете передать определенные параметры, как отправителя и, соответственно, переопределить.

1 вещь, которую нужно сохранить вразум.не забудьте вызвать супер метод в вашем методе executeSegue.

...