Ios 以编程方式执行Segue并将参数传递给目标视图
在我的应用程序中,我有一个按钮以编程方式执行一个序列:Ios 以编程方式执行Segue并将参数传递给目标视图,ios,view,parameters,storyboard,segue,Ios,View,Parameters,Storyboard,Segue,在我的应用程序中,我有一个按钮以编程方式执行一个序列: - (void)myButtonMethod { //execute segue programmatically [self performSegueWithIdentifier: @"MySegue" sender: self]; } 我想知道是否有方法引用目标视图并向其传递一些参数 我知道在prepareForSegue方法中,我可以使用以下命令来引用它:myDestinationViewController*vc=
- (void)myButtonMethod
{
//execute segue programmatically
[self performSegueWithIdentifier: @"MySegue" sender: self];
}
我想知道是否有方法引用目标视图并向其传递一些参数
我知道在prepareForSegue
方法中,我可以使用以下命令来引用它:myDestinationViewController*vc=[segue destinationViewController]代码>,但我不知道如何以编程方式执行segue
你有什么想法吗
谢谢,亚萨
更新:
我为这个问题感到抱歉!!!我只是发现,即使以编程方式调用segue,仍然会调用prepareforsgue
方法,因此可以以相同的常规方式传递参数。答案很简单,segue的触发方式没有区别
prepareforsgue:sender:
方法在任何情况下都会被调用,这是传递参数的地方。旧问题,但下面是关于如何执行所问操作的代码。在这种情况下,我将数据从表视图中的选定单元格传递到另一个视图控制器
在trget视图的.h文件中:
@property(weak, nonatomic) NSObject* dataModel;
在.m文件中:
@synthesize dataModel;
dataModel
可以是string
、int
,在本例中,它是一个包含许多项的模型
- (void)someMethod {
[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
}
或者
我理解在一个地方执行segue并维护状态以发送参数以准备segue的问题
我想出了一个办法。我使用一个类别向ViewController添加了一个名为userInfoDict的属性。我还用标识符覆盖了performsegue,这样一来,如果发送方是self(表示控制器本身)。它将把这个userInfoDict传递给下一个ViewController
在这里,您不需要传递整个UserInfoDict,还可以传递特定的参数作为发送方,并相应地进行覆盖
你需要记住的一件事。不要忘记在您的performsgue方法中调用super方法。以防您使用新的swift版本
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ChannelMoreSegue" {
}
}
Swift 4:
Swift 3:
将更新添加为答案并接受它,以便人们知道已回答此问题:)添加答案,注释以通知。您应该将答案标记为正确,以便人们知道已回答此问题。这仍然困扰着我-这意味着我必须在一个位置触发segue,在这里,我有我想作为参数发送的数据,这些数据与其他任何数据都很好地隔离开来,但是要将这些数据添加到一个完全不同的地方——prepareForSegue,在这里,我们对需要传递的数据一无所知。也就是说,我必须在由两个不同函数(一个触发segue,另一个-preparing)共享的上下文中创建一个有问题的数据的状态。当我只需要打开一个包含一些数据的新视图时,我不想弄脏状态…使用sender传递配置目标VCI所需的上下文我假设在sender中传递负载是一种反模式。它应该只包含触发segue的人的信息,而不是触发segue的东西打算进一步传递的数据。从发送者的官方文档中可以看出:“这个对象在实际segue期间用于提供信息。”是的,不要传递实际的负载,传递上下文,比如哪个单元格/按钮/索引/etc触发了segue。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ChannelMoreSegue" {
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ExampleSegueIdentifier" {
if let destinationVC = segue.destination as? ExampleSegueVC {
destinationVC.exampleString = "Example"
}
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ExampleSegueIdentifier" {
if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
destinationVC.exampleString = "Example"
}
}
}