为了账号安全,请及时绑定邮箱和手机立即绑定

什么是Unwind segues以及如何使用它们?

什么是Unwind segues以及如何使用它们?

iOS
墨色风雨 2019-05-24 16:27:51
什么是Unwind segues以及如何使用它们?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展开segue如何工作以及它们可以用于什么?
查看完整描述

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,例如ShowShow 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:

https://img1.sycdn.imooc.com//5ce7abdb0001fffc13280674.jpg

从代码中解除

通过控制拖动某些东西到视图控制器的“退出”符号来定义展开segue时,文档大纲中会出现一个新的segue:

https://img1.sycdn.imooc.com//5ce7abd2000156fa03210179.jpg

选择segue并转到Attributes Inspector会显示“Identifier”属性。使用此选项为您的segue提供唯一标识符:

https://img1.sycdn.imooc.com//5ce7abd50001d97502570100.jpg

在此之后,unwind segue可以像其他任何segue一样从代码执行:

Objective-C的:

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

迅速:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)


查看完整回答
反对 回复 2019-05-24
?
长风秋雁

TA贡献1757条经验 获得超7个赞

展开segue用于“返回”某个视图控制器,通过多个segues,您可以从中获取“当前”视图控制器。

想象一下,你有东西MyNavControllerA它的根视图控制器。现在你使用推送segue B。现在导航控制器的viewControllers数组中有A和B ,B是可见的。现在你以C模态呈现。

随着开卷塞格斯,你现在可以放松“回”从CB(即解雇模态呈现视图控制器),基本上是“撤销”的模式SEGUE。您甚至可以一直放松回到根视图控制器A,撤消模态segue和push segue。

展开segues可以轻松回溯。例如,在iOS 6之前,解除显示的视图控制器的最佳做法是将呈现视图控制器设置为呈现的视图控制器的委托,然后调用自定义委托方法,然后解除presentViewController。听起来既麻烦又复杂?它是。这就是为什么放松segues很好。


查看完整回答
反对 回复 2019-05-24
?
心有法竹

TA贡献1866条经验 获得超5个赞

我在其他答案中没有看到的东西就是当你不知道最初的segue起源在哪里时你如何处理放松,对我来说这是一个更重要的用例。例如,假设您有一个帮助视图控制器(H),您可以从两个不同的视图控制器(AB)以模态方式显示:

A → 
B → H

如何设置展开segue以便返回正确的视图控制器?答案是您在AB中 使用相同的名称声明一个展开动作,例如:

// put in AViewController.swift and BViewController.swift@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty}

这样,展开将找到任何视图控制器(AB)启动segue并返回到它。

换句话说,将展开动作视为描述segue的来源,而不是它将要去的地方。


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 726 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信