iOS 6和Xcode 4.5有一项称为“Unwind Segue”的新功能:
展开segue可以允许转换到故事板中现有的场景实例
除了Xcode 4.5发行说明中的这个简短条目之外,UIViewController现在似乎有几个新方法:
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
unwind segue如何工作以及它们可以用于什么?
6 回答
在果壳中
unwind segue (有时称为 exit segue )可用于导航推送,模态或弹出窗口(就像您从导航栏弹出导航项,关闭弹出窗口或解除模态显示的视图控制器) . 除此之外,您实际上不仅可以通过一个推送/模态/弹出窗口来展开,例如, "go back"导航层次结构中的多个步骤,只有一个展开操作 .
执行展开segue时,需要指定一个操作,该操作是要放松到的视图控制器的操作方法 .
Objective-C的:
迅速:
在故事板中创建展开segue时,将使用此操作方法的名称 . 此外,在执行展开segue之前调用此方法 . 您可以从传递的
UIStoryboardSegue
参数获取源视图控制器,以与启动segue的视图控制器进行交互(例如,获取模态视图控制器的属性值) . 在这方面,该方法具有与UIViewController
的prepareForSegue:
方法类似的功能 .iOS 8 update: Unwind segues也适用于iOS 8的自适应segue,例如Show和Show Detail .
一个例子
让我们有一个带有导航控制器和三个子视图控制器的故事板:
从绿色视图控制器,您可以放松(导航回)到红色视图控制器 . 从蓝色您可以放松到绿色或通过绿色的红色 . 要启用展开,您必须将特殊操作方法添加到红色和绿色,例如这是Red中的动作方法:
Objective-C的:
迅速:
添加操作方法后,您可以通过控制拖动到“退出”图标来定义故事板中的展开segue . 在这里,我们想要在按下按钮时从Green中解除Red:
您必须选择要在其中展开的视图控制器中定义的操作:
您还可以从Blue(在导航堆栈中“两步之遥”)放松到Red . 关键是选择正确的展开动作 .
在执行展开segue之前,调用action方法 . 在示例中,我从Green和Blue中定义了一个展开为红色的segue . 我们可以通过UIStoryboardSegue参数访问action方法中的unwind源:
Objective-C的:
迅速:
放卷也可以通过推/模态段的组合来实现 . 例如 . 如果我添加另一个带有模态segue的黄色视图控制器,我们可以一步一步从黄色放松回到红色:
从代码中展开
通过控制拖动某些东西到视图控制器的“退出”符号来定义展开segue时,文档大纲中会出现一个新的segue:
选择segue并转到Attributes Inspector会显示“Identifier”属性 . 使用此选项为您的segue提供唯一标识符:
在此之后,可以像其他任何segue一样从代码执行展开segue:
Objective-C的:
迅速:
至于如何在StoryBoard中使用展开segue ...
Step 1)
转到您希望 unwind to 的视图控制器的代码并添加:
Objective-C的
请务必在Obj-C中的.h文件中声明此方法
迅速
Step 2)
在故事板中,转到要放松的视图,只需将按钮中的segue拖动到源视图右上角的小橙色“EXIT”图标即可 .
现在应该有一个连接到“ - unwindToViewControllerNameHere”的选项
就是这样,当您点击按钮时,您的segue将会放松 .
展开segue用于“返回”某个视图控制器,通过多个segues,您可以从中获取“当前”视图控制器 .
想象一下,你有
MyNavController
与A
作为其根视图控制器 . 现在你使用push segue来B
. 现在导航控制器的viewControllers
数组中有A和B,B是可见的 . 现在你以模态方式呈现C
.使用展开segues,您现在可以将
C
从C
展开到B
(即解除模态显示的视图控制器),基本上是"undoing"模态segue . 您甚至可以一直放松回到根视图控制器A
,同时撤消模态segue和push segue .展开segues可以轻松回溯 . 例如,在iOS 6之前,解除显示的视图控制器的最佳做法是set the presenting view controller as the presented view controller’s delegate, then call your custom delegate method, which then dismisses the presentedViewController . 听起来既麻烦又复杂?它是 . 这就是为什么放松segues不错 .
我没有知道最初的segue起源于哪里,对我来说这是一个更重要的用例 . 例如,假设您有一个帮助视图控制器( H ),您可以从两个不同的视图控制器( A 和 B )以模态方式显示:
A → H
B → H
如何设置展开segue以便返回正确的视图控制器?答案是你在 A 和 B 中使用相同的名称声明一个展开动作,例如:
这样,展开将找到任何视图控制器( A 或 B )启动segue并返回到它 .
换句话说,将展开动作视为描述segue的来源,而不是它将要去的地方 .
Swift iOS:
步骤1:将此方法定义到MASTER控制器视图中 . 你要回去的地方:
第2步:( StoryBoard)右键单击你的SLAVE / CHILD EXIT按钮并选择“goToSideMenu”作为连接你的动作按钮,你将点击该按钮返回给你MASTER控制器视图:
第3步:构建并运行...
例如,如果从viewControllerB导航到viewControllerA,那么在viewControllerA下面,委托将调用并且数据将共享 .