Программно выполнить переход и передать параметры в целевое представление

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

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

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

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

Есть ли у вас какие-либо идеи?

Спасибо ясса


ОБНОВИТЬ:

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


person yassassin    schedule 12.02.2012    source источник
comment
Добавьте обновление в качестве ответа и примите его, чтобы люди знали, что на это ответили :)   -  person danielbeard    schedule 11.05.2012
comment
Добавьте ответ, комментарий для уведомления.   -  person DanSkeel    schedule 28.05.2012
comment
Вы должны отметить ответ ниже как правильный, чтобы люди знали, что на него дан ответ.   -  person lindon fox    schedule 06.09.2012


Ответы (5)


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

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

person trapper    schedule 28.05.2012
comment
Это все еще меня беспокоит - это означает, что я должен запустить segue в одном месте, где у меня есть данные, которые я хочу отправить в виде параметров, хорошо изолированных от всего остального, но чтобы добавить эти данные в совершенно другое место - prepareForSegue, где мы ничего не знаю о данных, которые необходимо передать. Это означает, что я должен создать состояние с этими данными в контексте, разделяемом двумя разными функциями (одна запускает переход, другая - подготовку). Я не хочу портить состояние, когда все, что мне нужно, это открыть новое представление с некоторыми данными ... - person NeverwinterMoon; 27.09.2018
comment
Используйте отправителя для передачи контекста, необходимого для настройки целевого виртуального канала - person trapper; 27.09.2018
comment
Я предположил, что передача полезной нагрузки в отправителе - это анти-шаблон. Он должен содержать только информацию о том, кто инициировал переход, а не данные, которые объект, вызвавший переход, намеревался передать дальше. - person NeverwinterMoon; 27.09.2018
comment
Из официальной документации по отправителю: этот объект доступен в информационных целях во время фактического перехода. - person NeverwinterMoon; 27.09.2018
comment
Да, не передавайте фактическую полезную нагрузку, передавайте контекст, например, какая ячейка / кнопка / индекс и т. Д. Вызвала переход. - person trapper; 27.09.2018

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

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

@property(weak, nonatomic)  NSObject* dataModel;

в файле .m:

@synthesize dataModel;

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

- (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;
    }
}
person user1723341    schedule 20.12.2012

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"
            }
        }
    }
person Jonas Deichelmann    schedule 12.03.2018

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

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

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

Одна вещь, о которой нужно помнить. не забудьте вызвать супер-метод в методе ur performSegue.

person karthik1729    schedule 05.09.2013

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

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

        }
}
person Pokotuz    schedule 08.03.2018