4 回答
TA贡献1802条经验 获得超6个赞
简而言之
一个退绕SEGUE(有时称为出口SEGUE)可用于导航回通过推,模态或酥料饼塞格斯(仿佛你弹出从导航栏的导航项目,关闭了酥料饼或驳回模态呈现视图控制器)。除此之外,您实际上不仅可以通过一个推送/模态/弹出窗口来展开,例如,使用单个展开动作“返回”导航层次结构中的多个步骤。
执行展开segue时,需要指定一个操作,该操作是要放松到的视图控制器的操作方法。
Objective-C的:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue{}
迅速:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {}
在故事板中创建展开segue时,将使用此操作方法的名称。此外,在执行展开segue之前调用此方法。您可以从传递的UIStoryboardSegue
参数获取源视图控制器以与启动segue的视图控制器交互(例如,获取模态视图控制器的属性值)。在这方面,该方法也有类似功能的prepareForSegue:
方法UIViewController
。
iOS 8更新:展开segues也适用于iOS 8的自适应segue,例如Show和Show Detail。
一个例子
让我们有一个带有导航控制器和三个子视图控制器的故事板:
从Green View Controller,您可以放松(导航回)到Red View Controller。从Blue您可以放松到Green或Red via Green。要启用展开,您必须将特殊操作方法添加到红色和绿色,例如,这里是红色的操作方法:
Objective-C的:
@implementation RedViewController- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue{}@end
迅速:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {}
添加操作方法后,您可以通过控制拖动到“退出”图标来定义故事板中的展开segue。在这里,我们想要在按下按钮时从Green中解除Red:
您必须选择要在其中展开的视图控制器中定义的操作:
您还可以从Blue(在导航堆栈中“两步之遥”)放松到Red。关键是选择正确的展开动作。
在执行展开segue之前,调用action方法。在示例中,我从Green和Blue中定义了一个展开为红色的segue。我们可以通过UIStoryboardSegue参数访问action方法中的unwind源:
Objective-C的:
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue{ UIViewController* sourceViewController = unwindSegue.sourceViewController; if ([sourceViewController isKindOfClass:[BlueViewController class]]) { NSLog(@"Coming from BLUE!"); } else if ([sourceViewController isKindOfClass:[GreenViewController class]]) { NSLog(@"Coming from GREEN!"); }}
迅速:
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) { if let blueViewController = unwindSegue.sourceViewController as? BlueViewController { println("Coming from BLUE") } else if let redViewController = unwindSegue.sourceViewController as? RedViewController { println("Coming from RED") }}
放卷也可以通过推/模态段的组合来实现。例如,如果我添加另一个带有模态segue的黄色视图控制器,我们可以在一步中从黄色一直放回到Red:
从代码中解除
通过控制拖动某些东西到视图控制器的“退出”符号来定义展开segue时,文档大纲中会出现一个新的segue:
选择segue并转到Attributes Inspector会显示“Identifier”属性。使用此选项为您的segue提供唯一标识符:
在此之后,unwind segue可以像其他任何segue一样从代码执行:
Objective-C的:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
迅速:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
TA贡献1757条经验 获得超7个赞
展开segue用于“返回”某个视图控制器,通过多个segues,您可以从中获取“当前”视图控制器。
想象一下,你有东西MyNavController
有A
它的根视图控制器。现在你使用推送segue B
。现在导航控制器的viewControllers
数组中有A和B ,B是可见的。现在你以C
模态呈现。
随着开卷塞格斯,你现在可以放松“回”从C
到B
(即解雇模态呈现视图控制器),基本上是“撤销”的模式SEGUE。您甚至可以一直放松回到根视图控制器A
,撤消模态segue和push segue。
展开segues可以轻松回溯。例如,在iOS 6之前,解除显示的视图控制器的最佳做法是将呈现视图控制器设置为呈现的视图控制器的委托,然后调用自定义委托方法,然后解除presentViewController。听起来既麻烦又复杂?它是。这就是为什么放松segues很好。
TA贡献1866条经验 获得超5个赞
我在其他答案中没有看到的东西就是当你不知道最初的segue起源在哪里时你如何处理放松,对我来说这是一个更重要的用例。例如,假设您有一个帮助视图控制器(H),您可以从两个不同的视图控制器(A和B)以模态方式显示:
A → H
B → H
如何设置展开segue以便返回正确的视图控制器?答案是您在A和B中 使用相同的名称声明一个展开动作,例如:
// put in AViewController.swift and BViewController.swift@IBAction func unwindFromHelp(sender: UIStoryboardSegue) { // empty}
这样,展开将找到任何视图控制器(A或B)启动segue并返回到它。
换句话说,将展开动作视为描述segue的来源,而不是它将要去的地方。
- 4 回答
- 0 关注
- 781 浏览
添加回答
举报