什么是放松的过程,你如何使用它们?
iOS 6和Xcode 4.5有一个新function,称为“解开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 (有时称为exit segue )通过push,modal或popover segues导航回来(就像从导航栏中popup导航项,closurespopup窗口或closures了模态表示的视图控制器一样)。 除此之外,实际上你可以通过一系列的push / modal / popover来实现放松,比如在你的导航层次结构中通过一个放松操作“返回”多个步骤。
当你执行一个unwind segue时,你需要指定一个动作,这是你想放松的视图控制器的动作方法。
Objective-C的:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue { }
迅速:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) { }
当您在故事板中创build展开渐变时,将使用此动作方法的名称。 而且,这个方法在执行unwind segue之前被调用。 您可以从传递的UIStoryboardSegue
参数中获取源视图控制器,以便与启动segue的视图控制器交互(例如获取模态视图控制器的属性值)。 在这方面,该方法具有与UIViewController
的prepareForSegue:
方法类似的function。
iOS 8更新: Unwind segues也适用于iOS 8的自适应游戏,例如显示和显示细节 。
一个例子
让我们有一个导航控制器和三个子视图控制器的故事板:
从绿色视图控制器,您可以放松(导航回)到红色视图控制器。 从蓝色,你可以放松到绿色或红色通过绿色。 要启用展开,您必须将特殊的操作方法添加到红色和绿色,例如这里是红色的操作方法:
Objective-C的:
@implementation RedViewController - (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue { } @end
迅速:
@IBAction func unwindToRed(segue: UIStoryboardSegue) { }
添加动作方法后,可以通过控制拖动到“退出”图标来定义故事板中的展开渐变。 这里我们想要按下button时从绿色解开到红色:
您必须select您想放松的视图控制器中定义的动作:
你也可以从蓝色(这是在导航堆栈“两步走”)放松到红色。 关键是select正确的展开动作。
在执行unwind segue之前,调用action方法。 在这个例子中,我定义了一个从绿色和蓝色都解放到红色的赛段。 我们可以通过UIStoryboardSegue参数访问操作方法中展开的源代码:
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,我们可以从黄色一路退到红色一步:
从代码展开
当通过控件拖动某些东西到视图控制器的“退出”符号来定义展开渐变时,文档大纲中会出现一个新的渐变:
selectsegue并转到Attributes Inspector将显示“标识符”属性。 用这个给你的segue一个唯一的标识符:
在这之后,可以像任何其他的segue一样从代码执行unwind segue:
Objective-C的:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
迅速:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
至于如何在StoryBoard中使用展开…
步骤1)
转到你想放松的视图控制器的代码,并添加:
Objective-C的
- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue { //nothing goes here }
一定要在Obj-C的.h文件中声明这个方法
迅速
@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) { //nothing goes here }
第2步)
在故事板中,转到您要放松的视图,只需从您的button或从源视图右上angular的小橙色“EXIT”图标拖动一个segue即可。
现在应该有一个选项来连接到“ – unwindToViewControllerNameHere”
就是这样,当你的button被点击时,你的继续将放松。
放松segues被用来“回到”一些视图控制器,通过一些segues你可以看到“当前”视图控制器。
想象一下你有一个以A
作为其根视图控制器的MyNavController
。 现在你用一个push到B
现在导航控制器的viewControllers
数组中有A和B,而B是可见的。 现在你模态地呈现C
在放松的情况下,你现在可以从C
退回到B
(即解除模态表示的视图控制器),基本上“撤消”模态的继续。 你甚至可以放松一切回到根视图控制器A
,同时撤消模态继续和推继续。
放松赛段可以让您轻松回溯。 例如,在iOS 6之前,解除呈现视图控制器的最佳做法是将呈现视图控制器设置为呈现视图控制器的委托,然后调用您的自定义委托方法,然后closurespresentViewController 。 声音麻烦而复杂? 它是。 这就是为什么unwind segues很好。
在这里我没有看到其他答案中提到的一些东西,那就是当你不知道最初的起始位置在哪里时,你如何处理这个问题,这对我来说是一个更重要的用例。 例如,假设您有两个不同的视图控制器( A和B )以模态方式显示的帮助视图控制器( H ):
A → H
B → H
你如何设置放松继续,以便你回到正确的视图控制器? 答案是你在A和B中声明一个相同名称的展开动作,例如:
// put in AViewController.swift and BViewController.swift @IBAction func unwindFromHelp(sender: UIStoryboardSegue) { // empty }
这样,展开将发现哪个视图控制器( A或B )启动了继续并返回到它。
换句话说,将放松行为想象为描述来自哪里,而不是去哪里。
Swift iOS:
第1步:将此方法定义到MASTER控制器视图中。 你想回去的地方:
//pragma mark - Unwind Seques @IBAction func goToSideMenu(segue: UIStoryboardSegue) { println("Called goToSideMenu: unwind action") }
第二步:(StoryBoard)右键单击你的SLAVE / CHILD EXITbutton,select“goToSideMenu”作为连接你的动作button,你将点击返回给你MASTER控制器视图:
第3步:构build并运行…