如何向自定义segue传递额外参数?

4
我一直在研究iOS中的自定义segue,并尽可能多地使用它们来使应用程序的完整工作流程可视化。当我创建一个弹出窗口segue时,它知道触发segue的视图(必须这样才能定位弹出窗口),但是当我创建一个自定义segue时,我找不到同样的方法。有没有一种方法可以在自定义segue中访问启动segue的视图?另外,是否有一种方法可以从Interface Builder传递自定义参数到segue,就像您可以将运行时参数传递给视图控制器一样?
1个回答

6

您可以通过实现以下方法来访问触发自定义segue的视图:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

...在您的视图控制器上。

在该方法中,如果您是通过 Interface Builder 连接的,则 sender 的值将是触发 segue 的视图。在实现此方法时,建议以以下方式查询触发的 segue:

if ([[segue identifier] isEqualToString:@"segueid"])

在Interface Builder中,"segueid"是您为Segue指定的标识符。

关于您的第二个问题,我不知道如何在Interface Builder中指定Segue的参数,但是您可以在运行时使用相同的“prepareForSegue”方法从您的视图控制器传递它们。

假设您的自定义Segue有一个名为animationStyle的属性

perform方法中,您可以进行以下操作:

- (void)perform
{
    switch (self.animationStyle) {
        case 0:
            // TODO Perform animation type 0
        case 1:
            // TODO Perform animation type 1
    }
}

接下来,假设你有几个视图控制器需要使用自定义的segue。在第一个视图控制器中,你可以实现performSegue方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"yourCustomSegueID"]) {
        ((YourCustomSegueClass *)segue).animationStyle = 0;
    }
}

当您在第二个视图控制器中时,可以这样实现:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"yourCustomSegueID"]) {
        ((YourCustomSegueClass *)segue).animationStyle = 1;
    }
}

实际上,您正在重复使用相同的自定义segue类以获得不同的效果。尽管如此,IB仍然不允许您直接配置segue,但据我所知,没有其他方法可以解决这个问题。


1
当自定义Segue特定于某些视图控制器时,这很好,但它不允许我创建可重用的自定义Segue,例如执行自定义动画,并从IB配置其参数。 - SoftMemes
我不确定我是否理解您的关注点。我知道我在Storyboard的不同点重复使用自定义segue。唯一需要注意的是,在每个将要使用它的View Controller上实现“prepareForSegue”方法,然后在其中为segue分配所需的参数。当然,您可以从不同的View Controller传递不同的参数以获得所需的结果。 - flainez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接