顺向页面跳转
-
事件跳转
- 应用场景:在明确点击摸个按钮或者cell或者手势事件直接跳转到下一个页面(而且是点击完就跳转)
- 实现步骤:先看下下面这张图片
这张图中实际的逻辑,是点击“我的club”按钮跳转到“我的club”页面。
以下步骤:
- 1、搭建好“course View Controller” 和 “我的club”页面
- 2、从“courser View Controller” 页面中的“我的club”按钮拖拽segue到“我的club”页面
只需以上两步就完成了,而且不需要设置segue的identifier(这是最简单的跳转)
- 代码跳转
应用场景:在按钮点击后做些逻辑处理后再(或者判断是否)跳转
-
实现步骤:这个和上一个“事件跳转”不同的地方,主要在于,不要从事件上拖拽segue到下一个控制器,而是前一个控制器上拖拽segue到下一个控制器上。
以下步骤:- 1、搭建好“course View Controller” 和 “我的club”页面
- 2、从“courser View Controller” 页面中的“我的club”按钮拖拽segue到“我的club”页面
- 3、配置segue的identifile
- 4、在需要跳转的地方,调用这个方法:
self?.performSegueWithIdentifier("segue的identifile", sender: nil)
UnWind Segue: 逆向页面跳转(返回前面指定的某一页)
应用场景: 从一个页面返回上一个页面或者前面的某一个页面
-
实现步骤:(以下将跳转的页面(self)用“当前页面”表示,需要跳转到的页面用“目标页面”表示)
- 第一步:在目标页面一定要实现这个方法:
// 注意: // @INAction一定要有,因为在storyboard中用到; // 后面的参数也一定要加; // 方法名自己定义(当然需要自己清楚这个方法名对应哪一个控制器的,不然多的时候很容易混淆) @IBAction func 方法名(segue: UIStoryboardSegue) { }
-
第二步:在storyboard中找到当前页面的控制器,然后建立连接
-
1、如图一,将从1拖segue到2,松手后会出现一些方法(见图二),你在目标页面添加的方法(步骤一添加的)
2、选定目标页面中的方法(如上图2,选中对应的方法)
-
3、前面两步完成后,将会在当前页面看到Unwind segue(如下图),点击选中后,会出现Unwind Segue的配置,此处一定要配置唯一的identifier
4、在对应的地方调用对应的方法,就可以跳转到之前的页面了
// segue的identifier是唯一的 // sender:传递参数,一般用不到,可以通过其他简单的方式处理,详见下面的“数据传递” self?.performSegueWithIdentifier("segue的identifile", sender: nil)
-
数据传递
-
下传:传递到下一个页面
每一个控制器都有一个系统的方法:override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let vc = segue.destinationViewController as? InstructorViewController { vc.instructor = instructors[sender as! Int] }
上面这个方法就是用来数据传递的:
- 方法调用时间:在跳转到下一个页面前就会实现
- 参数:
- segue:有identifier和destinationViewController 属性,供开发者判断跳转到哪一个控制器;
- sender:如果是控件点击事件跳转到下一个页面,sender就是对于的控件(button或者cell等)或手势(tap等);如果是代码调用(self?.performSegueWithIdentifier("segue的identifile", sender: nil))用这个方法,那sender传递的什么就是什么
-
回传:传递到前面指定的页面
在前面的“UnWind Segue:”部分我们有说到,在目标控制器中定义一个方法:@IBAction func 方法名(segue: UIStoryboardSegue) { }
这个方法,就可以用来值回传
- 实现时间:在跳转方法调用,当前页面消失之前调用
- 参数:segue的sourceViewController和identifier能判断和取出跳转回来的是那个页面(viewcontroller),页面控制器都拿到了,那要传递的数据想要什么就有什么
- 在页面跳转前处理下数据
在理解和吸收了前面两种值传递后,这个就是小儿科了。。。
这种情况只能通过代码调用这个方法去实现,在实现这句代码前面进行数据下载,下载成功后在调用页面跳转的方法:
self?.performSegueWithIdentifier("segue的identifile", sender: nil)
瘦身去臃肿
此部分是关于storyboard reference的应用
如上图,将storyboard拆分成了很多个,每一个都是单独的功能区,这样就不会导致在一个storyboard里出现n个控制器,之前的segue密密麻麻。
那这样拆分后如何像在一个storyboard中一样关联起来呢?这是和问题,以下是处理方式:
需求:从main.stroyboard中的clubsViewController跳转到Gig.storyboard中的ClubDetailViewController
-
实现:
- 第一步:在main.storyboard中的clubsViewController后面拖拽一
个storyboard reference
- 第一步:在main.storyboard中的clubsViewController后面拖拽一
-
第二步:设置storyboard reference:选中storyboard reference,右侧就会出现其属性的设置,选择对应的storyboard文件“Gig”
-
第三步:如果ClubDetailViewController是Gig.storyboard的initaiViewController,后面的就可以不用设置了,就完成了。但是我们打开Gig.storyboard文件查看后,ClubDetailViewController并不是。
因此,我们需要设置它的storyboard ID。设置完后,再回到ClubsViewController的地方,找到storyboard referrence,然后设置其Referenced ID,这个ID一定要和之前设置ClubDetailViewController的storyboard ID一样,否则会crash。
另外,同一个storyboard中也可以这样使用,比如,两个控制器距离太远,拖拽segue太不方便,这时候这种处理方式十分合适。