swift版本:3.0
Xcode版本:8.0
ios开发中用来在不同的controller之间跳转和传输数据的核心方法里面的一些常用的函数有prepare-shouldperformsegue-performsegue等但是他们之间的使用方法和调用顺序经常搞不清楚针对这个问题我做了一些关于segue的实验下面是研究记录">segue是ios开发中用来在不同的controller之间跳转和传输数据的核心方法,里面的一些常用的函数有prepare, shouldPerformSegue, performSegue等,但是他们之间的使用方法和调用顺序经常搞不清楚。针对这个问题我做了一些关于Segue的实验,下面是研究记录。
Segue 实验记录:
实验一:
- 新建两个页面,页面一和页面二
- 在页面一新建一个按钮“去页面二”,并control拖拽这个按钮到页面二,建立一个segue
- 在页面一的controller里面覆写以下三个方法
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
print("进入 shouldPerformSegue 函数")
super.shouldPerformSegue(withIdentifier: identifier, sender: sender)
print("离开 shouldPerformSegue 函数")
return true
}
override func performSegue(withIdentifier identifier: String, sender: Any?) {
print("进入 performSegue 函数")
super.performSegue(withIdentifier: identifier, sender: sender)
print("离开 performSegue 函数")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("进入 prepare 函数")
super.prepare(for: segue, sender: sender)
print("离开 prepare 函数")
}
- 编译运行程序,点击按钮“去页面二”,页面跳转至页面二,console有以下输出
进入 shouldPerformSegue 函数
离开 shouldPerformSegue 函数
进入 prepare 函数
离开 prepare 函数
实验结论:ios内部会先调用shouldPerformSegue函数,再调用prepare函数。
实验二:
1.将实验一中的shouldPerformSegue的返回值设置为false
4. 编译运行程序,点击按钮“去页面二”,页面未跳转,console有以下输出
进入 shouldPerformSegue 函数
实验结论:如果shouldPerformSegue返回值为false的话就不会执行prepare函数
实验三:
- 将实验一中的button在controller里面增加IBAction行为
设置之前的Segue的identifier为”ToPage2Segue”
在button的IBAction内写入以下内容
@IBAction func btnClick(_ sender: AnyObject) {
performSegue(withIdentifier: "ToPage2Segue", sender: nil)
}
- 编译运行,点击按钮,页面跳转,console有如下输出:
进入 performSegue 函数
进入 prepare 函数
离开 prepare 函数
离开 performSegue 函数
进入 shouldPerformSegue 函数
离开 shouldPerformSegue 函数
进入 prepare 函数
离开 prepare 函数
实验结论:即使已经control拽过线,也可以显式指定performSegue,会最先执行,同时由于连过线,所以shouldPerformSegue和prepare函数还是会执行一遍。在实际应用中应避免这种情况,否则极易出现混乱
实验四:
- 在实验三的基础上增加一个新的按钮 “我也去页面二”
- 在Controller里增加其IBAction,并写入以下内容
@IBAction func btn2Click(_ sender: UIButton) {
performSegue(withIdentifier: "ToPage2Segue", sender: nil)
}
- 编译运行,点击按钮,页面未跳转,console有如下输出:
进入 performSegue 函数
- 在storyboard内的页面一上面三个按钮中的第一个黄色按钮control拖拽到页面二,建立一个segue,命名为AlsoToPage2Segue
- 将第2步的内容改为如下
@IBAction func btn2Click(_ sender: UIButton) {
performSegue(withIdentifier: “AlsoToPage2Segue”, sender: nil)
} - 编译运行,点击按钮“我也去页面二”,页面跳转,console有如下输出:
进入 performSegue 函数
进入 prepare 函数
离开 prepare 函数
离开 performSegue 函数
实验结论:指定执行performSegue的时候,如果当前的sender没有连线,由于在performSegue内部调用了prepare函数,保证的segue的正常进行
实验五:测试unwind
- 在实验四的基础上给Page2新建一个controller
- 在Page1的controller里加入以下代码,以保证Page2可以返回到Page1
@IBAction func unwindFromPage2(_ segue: UIStoryboardSegue) {
print(“调用 unwindFromPage2”)
} - 在Page2的controller里面加入以下代码
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
print(“Page2 进入 shouldPerformSegue 函数”)
super.shouldPerformSegue(withIdentifier: identifier, sender: sender)
print(“Page2 离开 shouldPerformSegue 函数”)
return true
}
override func performSegue(withIdentifier identifier: String, sender: Any?) {
print(“Page2 进入 performSegue 函数”)
super.performSegue(withIdentifier: identifier, sender: sender)
print(“Page2 离开 performSegue 函数”)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print(“Page2 进入 prepare 函数”)
super.prepare(for: segue, sender: sender)
print(“Page2 离开 prepare 函数”)
} - 编译运行,点击“去页面二”,成功跳转,再点击 “返回 页面一”,成功返回,console显示
Page2 进入 shouldPerformSegue 函数
Page2 离开 shouldPerformSegue 函数
Page2 进入 prepare 函数
Page2 离开 prepare 函数
调用 unwindFromPage2
实验结论:unwind回上一个页面和正常segue是一样的,不同的是到了Page1后还会再次调用unwind函数
总结:
如果页面元素允许连线生成Segue的时候,尽量连线。在两个页面之间传递数据的时候,可以在shouldPerformSegue和prepare里面进行,shouldPerformSegue应用来做一些数据的校验工作,以确保传递的成功。prepare函数里面要对不同segue的identifier做好过滤,同时处理一下接收controller的事宜。
如果页面元素不允许连线生成Segue(比如动态生成的元素),则应该建立一个全局的segue,即从当前页面的根controller拖拽到下一个页面,然后在需要segue的地方执行performSegue,通过sender来区分不同的触发者。然后再在prepare里面写相应的处理函数。注意这里的不需也不要在去设置shouldPerformSegue函数,因为performSegue已经表示“确定”segue的含义。
注意!!!:没事不要随意override performSegue方法,如果忘记调用父类performSegue的话,会无法执行后面的prepare方法,无法完成一个完整的segue。
示例源码下载:http://download.csdn.net/detail/tsyccnh/9646750