一、简介

unwind segue通过允许你定义一个控制器和其他控制器的关系来扩展segue的概念,这个“关系”先于顺传(流式控制)的方式。基于unwind segue可以实现导航相反的效果,即将界面返回到一个已经存在的控制器实例。在大多数情况下,unwind segue可以代替“代理”(delegate)来将数据回传到之前的某个控制器。

一个unwind segue相当于一个触发的transition,这一点和segue类似;不同的是,unwind segue 是返回到一个在众多的用户界面中已经存在的某个控制器。一个unwind segue包含以下信息:

1. 事件源。即触发segue的对象。

2. 来源控制器。注意和顺传时的来源控制器区分开来。

3. 一个用来选择目标控制器的unwind 方法。

4. 一个用来标识segue的可选的字符串。

提示:unwind segue不包含目标控制器,这样设计是为了实现跳转的任意性(即可以跳转到任何一个你想跳转的控制器),其中目标控制器是在运行时确定的。

二、如何使用unwind segue

(1)在给app添加unwind segue之前,需要定义至少一个unwind 方法。定义unwind方法的要求是:

1.是objective-C方法;

2. 拥有一个唯一的参数,参数类型是UIStoryboardSegue;

3. 返回值类型是IBAction;

4. 对方法名称没有特殊要求,但建议起名具有唯一性和可读性。如下所示:

-(IBAction)unwindToLoginVc:(UIStoryboardSegue *)sender{

}

unwind 方法是为unwind segue而准备,在unwind segue触发时用来选择目标控制器的。因此,必须在每一个想要跳回的控制器中定义unwind方法。例如:控制器A将控制器B呈现到屏幕,那么控制器A内部应该定义一个unwind方法。同时,在控制器B中通过storyboard上的按钮连线unwind 方法。

(2)在storyboard中添加unwind segue

1.自动unwind Segue

按住 control建,将场景(scene)中的对象和其他控制器的exit图标 进行连线,连线时选择弹出的方法即可。在xcode6中,先右键点击exit图标,选择要连线的方法,然后和要连线的对象进行连线。

2. 手动unwind Segue

按住control键,点击控制器的viewController图标,拖线到该控制器的exit图标。

成功添加unwind Segue后,就能在场景面板中看到它了。与Segue一样,手动型unwind Segue需要提供一个标识字符串。通过调用

performSegueWithIdentifier:sender:

方法执行unwind Segue。

三、unwind 处理过程

1. 一个控制器被选作unwind segue的目标控制器

2. 来源控制器发送一条 prepareForSegue: sender: 消息,默认不做任何事。可以重写这个方法来传递数据给目标控制器。

3. 目标控制器发送一条消息,回应unwind segue的unwind 方法。

4. unwind segue 开始在来源控制器和目标控制器之前传递数据。

注意:控制器容器还有一些需要处理的东西。如果自定义了控制器容器,如自定义导航控制器,也需要参与到unwind 处理过程中来。(后面会说到)

四、unwind segue如何选择目标控制器

当unwind segue触发时,unwind segue必须找到符合要求的控制器作为目标控制器。如果没有找到,unwind segue执行会被取消。搜索顺序如下:

1.一条

viewControllerForUnwindSegueAction:fromViewController:withSender:

消息发送给来源控制器的父控制器。默认的实现是:检查消息接收者是否想处理unwind方法,如果是,返回消息接收者;否则,会搜索消息接收者的子控制器。canPerformUnwindSegueAction:fromViewController:withSender: 方法会被用来决定给定控制器是否能执行unwind action。

2.一条

viewControllerForUnwindSegueAction:fromViewController:withSender:消息发送给下一个父控制器......

提示:如果有特殊的业务需求,可以重写

canPerformUnwindSegueAction:fromViewController:withSender:方法。需要注意的是,如果消息接收者想处理unwind action,必须返回YES。

五、控制器容器

控制器容器在unwind segue 处理过程中有2件事要处理,如果你使用的控制器容器是SDK提供的,例如UINavigationController,这2件事是自动处理的。

(1)选择一个子控制器来处理unwind action

重写

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender方法。如果没有子控制器想处理unwind action,在方法内部应该调用父类的方法 并返回结果。

(2)在2个子控制器之间传递数据

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

谭家泉

2015-01-02 15:56:25

数据逆向传递 unwind segue的更多相关文章

  1. iOS9 Storyboard unwind segue反回传递事件时机详细步骤

    当返回上一个界面且需要上一个界面做某事时,用unwind segue实现起来比delegate简单许多,甚至有时不适合用delegate来实现,那么我们就用unwind segue吧,而且像1-> ...

  2. [转]ios 数据的传递

    情景1: A-->B  需要把数据传递到B里 代码: // 跳转 -- 执行login2contacts这个segue [self performSegueWithIdentifier:@&qu ...

  3. ASP.NET MVC5中View-Controller间数据的传递

    使用ASP.NET MVC做开发时,经常需要在页面(View)和控制器(Controller)之间传递数据,那么都有哪些数据传递的方式呢? 本文对于View向Controller中传值共列举了以下几种 ...

  4. C#学习笔记-数据的传递(公共变量)以及Dictionary

    看的代码越多,写的代码越多,就越是享受这些字符,终于渐渐懂得了那种传闻中的成就感,特别是自己从看不懂然后一步一步学,一个代码一个代码地敲,最后哪怕只是完成了一个小功能,也都是特别自豪的!这种自豪不用告 ...

  5. Intent之复杂数据的传递

    想在两个Activity之间传递一个对象Result,在网上差了很多,都需要序列化或者时下Paracelable,等等,试了很多都不行. 后来才制单,这个Result,根本不需要集成Sereriabl ...

  6. ASP.NET MVC3入门教程之参数(数据)传递

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=98&extra=page%3D1 MVC模式的参数(数据)传递 ...

  7. UnWind Segue

    iOS 6 和 Xcode 4.5 中添加了一个新特性叫做“Unwind Segue”. 使用Unwind Segue,可以方便的在Navigation Controller的Controllers之 ...

  8. 37.Activity之间的转换以及数据的传递(Intent)学习

      Intent简介:                                                                                在一个Androi ...

  9. MVC中Model,不仅仅只是数据的传递者

    在Model使用的时候很多人回向以前写三层架构一样使用它,将Model作为数据的传递者. 比如常见的写法 public int Id { get; set; } public int RoleId { ...

随机推荐

  1. [BZOJ 2350] [Poi2011] Party 【Special】

    题目链接: BZOJ - 2350 题目分析 因为存在一个 2/3 n 大小的团,所以不在这个团中的点最多 1/3 n 个. 牺牲一些团内的点,每次让一个团内的点与一个不在团内的点抵消删除,最多牺牲 ...

  2. Unity3D内存释放

    Unity3D内存释放 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resourc ...

  3. TWinControl.SetBounds与TWinControl.UpdateBounds赏析(定义和调用)

    先看它们的函数内容: procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin // 虚函数,TWinCon ...

  4. [LeetCode#55, 45]Jump Game, Jump Game II

    The problem: Given an array of non-negative integers, you are initially positioned at the first inde ...

  5. hiho #1055 : 刷油漆

    上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并 ...

  6. 实战weblogic集群之创建节点和集群

    一.启动weblogic,访问控制台 weblogic的domain创建完成后,接下来就可以启动它,步骤如下: $ cd /app/sinova/domains/base_domain/bin $ . ...

  7. 【宽搜】BAPC2014 J Jury Jeopardy (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  8. Fire Net(深搜 和一前不一样的深搜)

    /* http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1162 本题妙处: 用一个数对行取商是 ...

  9. lightoj 1291 无向图边双联通+缩点统计叶节点

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1291 #include<cstdio> #include<cstri ...

  10. OpenStack 应用调试