以编程方式执行 Segue 并将参数传递到目标视图

在我的应用程序中,我有一个按钮,可以程序化地执行一个接口:

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

我想知道是否有一种方法可以引用目标视图并传递给它一些参数。

我知道在 prepareForSegue方法中,我可以用: myDestinationViewController *vc = [segue destinationViewController];引用它,但是我不知道如何用编程方式执行 segue。

你有什么主意吗?

谢谢,丫头


更新:

我为这个问题道歉! ! !我只是发现,即使通过编程方式调用 segue,仍然会调用 prepareForSegue方法,因此可以用通常的方式传递参数。

173138 次浏览

答案很简单,如何触发转折并不重要。

在任何情况下都会调用 prepareForSegue:sender:方法,这是您传递参数的地方。

这是个老问题了,但是这里有一些关于如何做你所要求的事情的代码。在这种情况下,我将数据从表视图中的选定单元格传递到另一个视图控制器。

在 trget 视图的.h 文件中:

@property(weak, nonatomic)  NSObject* dataModel;

在.m 文件中:

@synthesize dataModel;

dataModel可以是 stringint,或者就像在这个例子中一样,它是一个包含许多项目的模型

- (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;
}
}

我理解在一个地方执行接续和维持状态以发送参数为接续做准备的问题。

我想到办法了。我已经使用类别向 ViewController 添加了一个名为 userInfoDect 的属性。我已经覆盖执行继续与标识符,以这样的方式,如果发送者是自我(意味着控制器本身)。它将把这个 userInfoDect 传递给下一个 ViewController。

这里不传递整个 UserInfoDect,而是传递特定的参数,作为发送者并相应地重写。

需要记住的一件事情是: 不要忘记在 PerformSegue 方法中调用 super 方法。

如果你使用新的迅捷版本。

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


}
}

迅捷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"
}
}
}