一、简介

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. 关于set或map的key使用自定义类型的问题

    我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...

  2. 转:2014年最酷的30个JavaScript库

    原文来自于:http://www.gbtags.com/gb/share/3701.htm 使用JavaScript库将会使开发变的更简单,大部分JavaScript库提供的功能都是极好的,当我们在为 ...

  3. java 内存 垃圾回收调优

    要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...

  4. 通过预编译头文件来提高C++ Builder的编译速度

    C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...

  5. node.js基础模块http、网页分析工具cherrio实现爬虫

    node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...

  6. [LeetCode#136, 137]Single Number, Single Number 2

    The question: Single Number Given an array of integers, every element appears twice except for one. ...

  7. BZOJ 1071 [SCOI2007]组队

    1071: [SCOI2007]组队 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1330  Solved: 417[Submit][Status][ ...

  8. OC中的野指针(僵尸指针)

    涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在.比如定义UIView * view = [[UIView alloc]i ...

  9. wpa_cli和wpa_supplicant使用,配置无线AP名和密码,静态ip地址

    配置静态ip方法分享:通过串口命令行输入如下命令: 1. 添加无线网络接入点(AP) 及其 密码:# wpa_cli -p /data/misc/wpa_supplicantwpa_cli v0.5. ...

  10. (转载)PHP静态方法

    (转载)Lamp兄弟连PHP 6.静态方法(static修饰的方法),不能访问非静态成员(在非静态的方法中,可以访问静态成员).因为非静态的成员,就必须用对象来访问,访问内部的成员使用的就是$this ...