我一直在研究iOS中的自定义segue,并尽可能多地使用它们来使应用程序的完整工作流程可视化。当我创建一个弹出窗口segue时,它知道触发segue的视图(必须这样才能定位弹出窗口),但是当我创建一个自定义segue时,我找不到同样的方法。有没有一种方法可以在自定义segue中访问启动segue的视图?另外,是否有一种方法可以从Interface Builder传递自定义参数到segue,就像您可以将运行时参数传递给视图控制器一样?
您可以通过实现以下方法来访问触发自定义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,但据我所知,没有其他方法可以解决这个问题。