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

时间:2012-02-12 12:34:30

标签: ios view parameters storyboard segue

在我的应用程序中,我有一个以编程方式执行segue的按钮:

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

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

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

你有什么想法吗?

谢谢,yassa


更新:

对不起这个问题!!!我只是发现,即使以编程方式调用segue,也会调用prepareForSegue方法,因此可以以相同的方式传递参数。

5 个答案:

答案 0 :(得分:105)

答案很简单就是如何触发segue没有区别。

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

答案 1 :(得分:90)

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

在trget视图的.h文件中

@property(weak, nonatomic)  NSObject* dataModel;
<。>文件中的

@synthesize dataModel;

dataModel可以是stringint,或者在这种情况下,它是包含许多项目的模型

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我理解在一个地方执行segue并保持状态发送参数以准备segue的问题。

我找到了一种方法来做到这一点。我已经使用类别向ViewControllers添加了一个名为userInfoDict的属性。并且我也使用标识符覆盖执行segue,这样如果发送者是self(意味着控制器本身)。它会将此userInfoDict传递给下一个ViewController。

此处,您可以传递特定参数,而不是传递整个UserInfoDict,作为发送方并相应地覆盖。

你需要牢记的一件事。不要忘记在你的performSegue方法中调用super方法。

答案 4 :(得分:0)

如果你使用新的swift版本。

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

        }
}