使用storyboard开发的时候,经常会在一个scene上添加一个button,再拖拽这个button到某个想要关联的页面,最后选择push的方式跳转。这样scene_A和scene_B就有了一个“顺序”的跳转方式了。但有时,希望可以从scene_B触发某个action,跳转回scene_A。如果还采用刚才的方式,就会有问题。因为,跳回的那个scene_a已经不是原来的那个scene_A了。这就需要使用到storyboard的unwind
segue了。写个demo小总结一下:

创建如下图所示的storyboard。 RedViewController push到 YellowViewController, YellowViewController push到BlueViewController, BlueViewController modal到 GreenViewController。从YellowViewController可以返回RedViewController,从BlueViewController可以返回YellowViewController和RedViewController。当然,从GreenViewController也是可以返回到BlueViewController的。

回到代码部分。因为使用了storyboard,push、model的跳转都省去了写代码,同理,“返回”的跳转也是省去了代码的。

RedViewController.m中

- (IBAction)unwindSegueToRedViewController:(UIStoryboardSegue *)segue {

    

}

需要注意的是这个方法的返回值必须是ibaction,参数必须是uistoryboardsegue。至于为什么,后面的代码会有体现。

回到storyboard文件,观察到RedViewController的scene下方有个绿色的按钮(不是因为写了上面的代码才出现绿色按钮,而是一直都存在的)。



接下来,右键exit按钮(绿色按钮),就会出现刚才写的方法unwindseguetoredviewcontroller:



选中这个方法,拖拽至YellowViewController的back redvc按钮。



放手之后,会在back redvc附近出现一个action的提示,选中。这样,当点击yellowviewcontroller的back red vc按钮之后,就会跳回red view controller。编译一下,取保没有问题。运行程序。

需要的说明:

1.如果你像从yellowviewcontroller返回到redviewcontroller,那么unwind segue关联的方法必须要再redviewcontroller中写明,即此例子中的-(inaction)unwindtoredviewcontroller:(uistoryboardsegue
*)segue;注意参数和返回指,方法名任意。

2.是右键redviewcontroller的exit按钮(绿色按钮)出现unwind segue可以关联的方法,然后去关联yellowviewcontroller的button。

同理,可以做BlueViewController返回到YellowViewController的实现。

在YellowViewoController.m中

- (IBAction)unwindToYellowViewController:(UIStoryboardSegue *)segue {

    

}

右键yellowviewcontroller的exit按钮,关联blueviewcontroler的back yellowvc 按钮。

还需要实现从blueviewcontroller直接返回到redviewcontroller中,选中redviewcontroller的exit按钮,选择unwindtoredviewcontroller关联blueviewcontroller上的按钮。

编译一下,没有任何问题,运行程序,感受一下。

从YellowViewController和BlueViewController都可以返回到RedViewController,此时需要做一个判断,看看到底是从哪里返回的。

  1. - (IBAction)unwindSegueToRedViewController:(UIStoryboardSegue *)segue {
  2. UIViewController *sourceViewController = segue.sourceViewController;
  3. if ([sourceViewController isKindOfClass:[YellowViewController class]]) {
  4. NSLog(@"from yellow vc");
  5. }
  6. else if ([sourceViewController isKindOfClass:[BlueViewController class]]) {
  7. NSLog(@"from blue vc");
  8. }
  9. }

这也是为什么方法的参数是segue的原因,通过segue可以拿到source view controller(源视图控制器)。

尝试push之后,modal也是同样的道理,用modal模式从blueviewcontroller展示greenviewcontroller。

要想返回,需要在blueviewcontroller中写关联unwind segue的方法:

- (IBAction)unwindToBlueViewController:(UIStoryboardSegue *)segue {

    

}

关联unwindtoblueviewcontroller方法到相应的button上。

至此,使用storyboard“返回”就告一段落了,大多数时间,花销在拖拽控件上,根本没有写相关pop dismiss方法。这也是storyboard的一大优势。

是不是也可以用代码实现呢?可以的。

在storyboard中选中GreenViewController scene,在左侧可以看到unwind segue的表示,有点像DNA序列是的,选中之后,定义它的唯一表示为greenUnwind

在greenviewcontroller.m中

back code按钮关联的方法:

  1. -(IBAction)backCodeBtnTapped:(id)sender {
  2. [self performSegueWithIdentifier:@"greenUnwind" sender:self];
  3. }

编译一下,没有任何错误,运程程序。

iOS Storyboard unwind segues使用小结的更多相关文章

  1. iOS界面设计切图小结

    iOS界面设计切图小结 APR 12TH, 2013 1.基本尺寸 (1)界面 实际设计时按: iPhone4.4s:640px*960px iPhone5: 640px*1136px iPad:15 ...

  2. 对照 Android 的 Intent 与 iOS StoryBoard 的 Segue - Intent 假设也能添加个prepareForSegue回调就好了

    对照 Android 的 Intent 与 iOS StoryBoard 的 Segue - Intent 假设也能添加个prepareForSegue回调就好了 太阳火神的漂亮人生 (http:// ...

  3. iOS Storyboard全解析

    来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果, ...

  4. iOS Storyboard 的基本用法

    (Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图:  现 在,你就可以清楚的看 ...

  5. IOS Storyboard使用-模拟登录、注册、混合使用

    最近分析IOS的占有率,发现5.0以下的少之又少了,故而决定新的App用 Storyboard开发,找了很多资料都是点上的,这个简单的demo是测试代码,发上来,供新手参考. 模拟登录.注册.和显示主 ...

  6. [IOS] Storyboard全解析-第一部分

    (Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这 ...

  7. iOS Storyboard适配问题

      通用的Storyboard 通用的stroyboard文件是通向自适应布局光明大道的第一步.在一个storyboard文件中适配iPad和iPhone的布局在iOS8中已不再是梦想.我们不必再为不 ...

  8. iOS应用构建与部署小结

    注:本文首发于我的个人博客:https://evilpan.com/2019/04/06/ios-basics/ 上篇文章介绍了Objective-C的基本概念,本文就来接着看如何创建我们的第一个简单 ...

  9. iOS开发之山寨版新浪微博小结

    在之前的博客IOS开发之新浪围脖中获取微博的内容是使用我自己的access_token来请求的数据,那么如何让其他用户也能登陆并获取自己的微博内容呢?接下来就是OAuth和SSO出场的时候啦.OAut ...

随机推荐

  1. es6学习笔记--解构赋值

    昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.   数组的解构 ...

  2. ThreadPoolExecutor线程池参数设置技巧

    一.ThreadPoolExecutor的重要参数   corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线 ...

  3. iOS超全开源框架、项目和学习资料汇总 UI篇

    上下拉刷新控件 MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明. AutoLayout ...

  4. 【BZOJ1996】合唱队(动态规划)

    [BZOJ1996]合唱队(动态规划) 题面 BZOJ 题解 很容易的一道题 因为每个人不是放在了左边就是放在了右边 所以每次放好的人必定是原序列的一个子串 所以,很容易想到区间\(dp\) 设\(f ...

  5. 【NOIP2014】解方程(枚举)

    题面 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入格式 输入共n + 2 行. 第一行包含2 个整数 ...

  6. [BZOJ3275] Number (网络流)

    Description 有N个正整数,需要从中选出一些数,使这些数的和最大. 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a*a+b*b=c*c 2:gcd(a,b)=1 ...

  7. Android开发——设置界面的创建

    前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...

  8. Django 2.0 学习(03):Django视图和URL(下)

    接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...

  9. JAVA学习:面向对象编程

    "算法+数据结构=程序"是一句经典名言,这句话很直接的说明了程序的本质:处理数据.产生结果.即便是最简单的HelloWorld程序,我们也可以将字符串"HelloWorl ...

  10. puppet客户端拉取服务端的资源时报错

    2017-11-01   16:21:47 客户端再拉取服务端的配置的资源时,出现一下报错: 造成原因:服务配置的资源不可用: 解决办法:将服务端不正确的资源配置删除: master:   cd   ...