如何以编程方式执行Unwind segue?

tad*_*asz 299 ios segue ios6

使用故事板这很容易.您只需将操作拖动到"退出"即可.但是我该如何从我的代码中调用它呢?

Vad*_*dim 278

  1. 创建手动segue(ctrl从文件所有者到退出的-drag),
  2. 在绿色EXIT按钮下方的左控制器菜单中选择它.

在绿色EXIT按钮下方的左控制器菜单中选择它

插入Segue名称以放松.

然后,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.用你的segue识别.

  • 对于那些像我一样*仍然*在实现这个答案时遇到问题的人,我在这个回购中整理了一个更全面的演练和示例:https://github.com/bradley/iOSUnwindSegueProgramatically(不试图为自己做广告,我只是在这上面撞了几个小时我的头撞到墙上,看到工作设置帮助我.) (71认同)
  • 1)"文件所有者" - 不是那么古老的术语吗?我可以控制从视图控制器到其"退出"图标的拖动.2)虽然它应该是显而易见的,但是Xcode正在寻找IBAction接口中的声明,该声明采用UIStoryboardSegue参数; WWDC 2012会话407谈话没有提到那个并且没有粘贴该代码.没有它,我的Exit图标在控制拖动时不会激活.3)非常酷,在你的大红色箭头结束时,在Action字段中,你可以点击"去那里"箭头! (24认同)
  • @bradleygriffith我希望你能给这个答案,所以我也可以把它标记出来!您的独特贡献是建立*哪个视图控制器获取代码*.找不到任何地方.谢谢! (7认同)
  • @bradleygriffith你真是太棒了.感谢您的精彩演练! (3认同)
  • 对于任何仍然难以置信的人来说,关键是IBACTION需要在你正在返回的视图控制器中,而不是你当前所在的视图控制器.@ bradleygriffith在GitHub上拼出这个,但是我还没有看到其他地方提到过.那部分是至关重要的. (3认同)

smi*_*Bot 159

这是Objective C和Swift的完整答案:

1)IBAction在目标视图控制器中创建一个展开segue(您想要转到的位置).实施文件中的任何位置.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }
Run Code Online (Sandbox Code Playgroud)

2)在源视图控制器(您正在调整的控制器)上,^ +从"活动名称"拖动到退出.您应该在弹出窗口中看到步骤1中创建的展开segue.(如果您没有看到它,请查看第一步).选择unwindToContainerVC:从弹出窗口或您命名方法的任何内容,将源控制器连接到展开IBAction.

在此输入图像描述

3)在源视图控制器的故事板的文档大纲中选择segue(它将在底部附近列出),并为其指定标识符.

在此输入图像描述

4)从视图控制器使用此方法调用unwind segue ,替换unwind segue名称.

//目标C.

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

//斯威夫特

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB.在unwind方法上使用segue参数的sourceViewController属性来访问源控制器上的任何公开属性.另外,请注意框架处理解雇源控制器.如果您想确认这一点,请向源控制器添加一个dealloc方法,并使用一条日志消息,该消息一旦被杀死就应该触发.如果dealloc不起火你可能有一个保留周期.

  • 我的程序不起作用,甚至不叫`(IBAction)unwindToContainerVC:(UIStoryboardSegue*)segue` (2认同)
  • 当您正在展开的视图控制器仅存在于您的故事板中时,此解决方案不起作用,也就是说在代码实现中没有自定义 (2认同)
  • 对于 Swift 4.2 使用: self.performSegue(withIdentifier: "unwindToVC", sender: self) (2认同)

Dea*_*ean 76

bradleygriffith的答案很棒.我采取了步骤10,并进行了简化截图.这是Xcode 6中的屏幕截图.

简单控制 - 从橙色图标拖动到红色"退出"图标,以在视图中创建一个没有任何操作/按钮的展开.

在此输入图像描述

然后选择unwind segue并设置一些标识符以从代码中访问它.

在此输入图像描述

在代码中,

[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
Run Code Online (Sandbox Code Playgroud)

  • 首先,unwin的方法必须包含在`UIViewController`中.那你的解决方案就可以了 (4认同)
  • 你必须将Identifier设置为这个新的segue!别忘了. (4认同)

小智 13

我用过[self dismissViewControllerAnimated: YES completion: nil];哪个会让你回复ViewController.

  • Larry,如果您想要返回到之前的视图控制器,即提供您正在退出的视图控制器的视图控制器,那么这是一种非常有效的方法.问题出现了,因为Xcode 4.5中的新功能是能够从演示顺序中的某个视图控制器"展开"到更早的视图控制器.有关详细信息,请参见WWDC 2012会话407. (6认同)

Vis*_*hry 11

从Apple关于Unwind Segue的技术说明中引用文本:要添加仅以编程方式触发的展开segue,控制+从场景的视图控制器图标拖动到其退出图标,然后从弹出菜单中选择新segue的展开动作.

链接到技术说明


Jas*_*ker 6

Vishal Chaudhry上面的回答对我有用.我还要补充一点,以便使用以下方法手动触发seque:

[self performSegueWithIdentifier:@"mySegueName" sender:self];
Run Code Online (Sandbox Code Playgroud)

在ViewController中你还必须在故事板中的ViewController的Scene下选择unwind segue,并在RHS的属性视图中确保Indentifier字段包含你在代码中引用的名字(上例中的"mySegueName") ).

如果省略此步骤,则上面的行将抛出一个异常,即seque名称未知.