it-swarm.com.ru

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

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

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

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

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

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

Спасибо ясса


Обновление:

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

172
yassassin

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

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

104
trapper

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

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

Свифт 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"
            }
        }
    }
2
Jonas Deichelmann

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

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

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

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

0
karthik1729

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

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

        }
}
0
Pokotuz