Выполните Segue программно и передайте параметры в представление назначения


174

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

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

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

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

У тебя есть идеи?

Спасибо ясса


ОБНОВИТЬ:

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


44
Добавьте обновление в качестве ответа и примите его, чтобы люди знали, что на него дан ответ :)
danielbeard

Добавить ответ, комментарий к уведомлению.
DanSkeel

11
Вы должны пометить ответ ниже как правильный, чтобы люди знали, что на него дан ответ.
Линдон Фокс

Ответы:


107

Ответ прост: нет никакой разницы в том, как вызван переход.

prepareForSegue:sender:Метод вызывается в любом случае , и это, когда вы передаете свои параметры в поперечнике.


3
Это все еще беспокоит меня - это означает, что я должен вызвать segue в одном месте, где у меня есть данные, которые я хочу отправить в качестве параметров, красиво изолированных от чего-либо еще, но добавить эти данные в совершенно другое место - prepareForSegue, где мы ничего не знаю о данных, которые должны быть переданы. Это значит, что я должен создать состояние с этими данными в контексте, совместно используемом двумя разными функциями (одна вызывает запуск, другая - подготавливает). Я не хочу пачкать состояние, когда все, что мне нужно, это открыть новый вид с некоторыми данными ...
NeverwinterMoon

Используйте отправителя для передачи контекста, необходимого для настройки целевого VC
trapper

Я предположил, что передача полезных данных в отправителя является анти-паттерном. Он должен просто содержать информацию о том, кто вызвал переход, а не данные, которые вещь, которая инициировала переход, намеревалась пройти дальше.
NeverwinterMoon

Из официальных документов об отправителе: «Этот объект сделан доступным для информационных целей во время фактического перехода».
NeverwinterMoon

1
Да, не передавайте фактическую полезную нагрузку, передавайте контекст, например, какая ячейка / кнопка / индекс / и т.д. запускает переход.
траппер

90

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

в .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;
    }
}

3

Свифт 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

Свифт 3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

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

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

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

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


0

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

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

        }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.