数据逆向传递 unwind segue
一、简介
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的更多相关文章
- iOS9 Storyboard unwind segue反回传递事件时机详细步骤
当返回上一个界面且需要上一个界面做某事时,用unwind segue实现起来比delegate简单许多,甚至有时不适合用delegate来实现,那么我们就用unwind segue吧,而且像1-> ...
- [转]ios 数据的传递
情景1: A-->B 需要把数据传递到B里 代码: // 跳转 -- 执行login2contacts这个segue [self performSegueWithIdentifier:@&qu ...
- ASP.NET MVC5中View-Controller间数据的传递
使用ASP.NET MVC做开发时,经常需要在页面(View)和控制器(Controller)之间传递数据,那么都有哪些数据传递的方式呢? 本文对于View向Controller中传值共列举了以下几种 ...
- C#学习笔记-数据的传递(公共变量)以及Dictionary
看的代码越多,写的代码越多,就越是享受这些字符,终于渐渐懂得了那种传闻中的成就感,特别是自己从看不懂然后一步一步学,一个代码一个代码地敲,最后哪怕只是完成了一个小功能,也都是特别自豪的!这种自豪不用告 ...
- Intent之复杂数据的传递
想在两个Activity之间传递一个对象Result,在网上差了很多,都需要序列化或者时下Paracelable,等等,试了很多都不行. 后来才制单,这个Result,根本不需要集成Sereriabl ...
- ASP.NET MVC3入门教程之参数(数据)传递
本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=98&extra=page%3D1 MVC模式的参数(数据)传递 ...
- UnWind Segue
iOS 6 和 Xcode 4.5 中添加了一个新特性叫做“Unwind Segue”. 使用Unwind Segue,可以方便的在Navigation Controller的Controllers之 ...
- 37.Activity之间的转换以及数据的传递(Intent)学习
Intent简介: 在一个Androi ...
- MVC中Model,不仅仅只是数据的传递者
在Model使用的时候很多人回向以前写三层架构一样使用它,将Model作为数据的传递者. 比如常见的写法 public int Id { get; set; } public int RoleId { ...
随机推荐
- [BZOJ 2350] [Poi2011] Party 【Special】
题目链接: BZOJ - 2350 题目分析 因为存在一个 2/3 n 大小的团,所以不在这个团中的点最多 1/3 n 个. 牺牲一些团内的点,每次让一个团内的点与一个不在团内的点抵消删除,最多牺牲 ...
- Unity3D内存释放
Unity3D内存释放 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resourc ...
- TWinControl.SetBounds与TWinControl.UpdateBounds赏析(定义和调用)
先看它们的函数内容: procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin // 虚函数,TWinCon ...
- [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 ...
- hiho #1055 : 刷油漆
上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并 ...
- 实战weblogic集群之创建节点和集群
一.启动weblogic,访问控制台 weblogic的domain创建完成后,接下来就可以启动它,步骤如下: $ cd /app/sinova/domains/base_domain/bin $ . ...
- 【宽搜】BAPC2014 J Jury Jeopardy (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- Fire Net(深搜 和一前不一样的深搜)
/* http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1162 本题妙处: 用一个数对行取商是 ...
- lightoj 1291 无向图边双联通+缩点统计叶节点
题目链接:http://lightoj.com/volume_showproblem.php?problem=1291 #include<cstdio> #include<cstri ...
- OpenStack 应用调试