iOS开发中有关Segue传输的流程研究

news/2024/7/20 22:59:53 标签: ios, swift

swift版本:3.0
Xcode版本:8.0

ios开发中用来在不同的controller之间跳转和传输数据的核心方法里面的一些常用的函数有prepare-shouldperformsegue-performsegue等但是他们之间的使用方法和调用顺序经常搞不清楚针对这个问题我做了一些关于segue的实验下面是研究记录">segue是ios开发中用来在不同的controller之间跳转和传输数据的核心方法,里面的一些常用的函数有prepare, shouldPerformSegue, performSegue等,但是他们之间的使用方法和调用顺序经常搞不清楚。针对这个问题我做了一些关于Segue的实验,下面是研究记录。

Segue 实验记录:

实验一:

  1. 新建两个页面,页面一和页面二
  2. 在页面一新建一个按钮“去页面二”,并control拖拽这个按钮到页面二,建立一个segue
    图片1
  3. 在页面一的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 函数")
    }
  1. 编译运行程序,点击按钮“去页面二”,页面跳转至页面二,console有以下输出

进入 shouldPerformSegue 函数
离开 shouldPerformSegue 函数
进入 prepare 函数
离开 prepare 函数

实验结论:ios内部会先调用shouldPerformSegue函数,再调用prepare函数。


实验二:

1.将实验一中的shouldPerformSegue的返回值设置为false
4. 编译运行程序,点击按钮“去页面二”,页面未跳转,console有以下输出

进入 shouldPerformSegue 函数

实验结论:如果shouldPerformSegue返回值为false的话就不会执行prepare函数


实验三:

  1. 将实验一中的button在controller里面增加IBAction行为
  2. 设置之前的Segue的identifier为”ToPage2Segue”

  3. 在button的IBAction内写入以下内容

    @IBAction func btnClick(_ sender: AnyObject) {
        performSegue(withIdentifier: "ToPage2Segue", sender: nil)
    }
  1. 编译运行,点击按钮,页面跳转,console有如下输出:

进入 performSegue 函数
进入 prepare 函数
离开 prepare 函数
离开 performSegue 函数

进入 shouldPerformSegue 函数
离开 shouldPerformSegue 函数
进入 prepare 函数
离开 prepare 函数

实验结论:即使已经control拽过线,也可以显式指定performSegue,会最先执行,同时由于连过线,所以shouldPerformSegue和prepare函数还是会执行一遍。在实际应用中应避免这种情况,否则极易出现混乱


实验四:

  1. 在实验三的基础上增加一个新的按钮 “我也去页面二”
  2. 在Controller里增加其IBAction,并写入以下内容
   @IBAction func btn2Click(_ sender: UIButton) {
        performSegue(withIdentifier: "ToPage2Segue", sender: nil)
    }
  1. 编译运行,点击按钮,页面未跳转,console有如下输出:

进入 performSegue 函数

  1. 在storyboard内的页面一上面三个按钮中的第一个黄色按钮control拖拽到页面二,建立一个segue,命名为AlsoToPage2Segue
    图片2
  2. 将第2步的内容改为如下
    @IBAction func btn2Click(_ sender: UIButton) {
    performSegue(withIdentifier: “AlsoToPage2Segue”, sender: nil)
    }
  3. 编译运行,点击按钮“我也去页面二”,页面跳转,console有如下输出:

进入 performSegue 函数
进入 prepare 函数
离开 prepare 函数
离开 performSegue 函数

实验结论:指定执行performSegue的时候,如果当前的sender没有连线,由于在performSegue内部调用了prepare函数,保证的segue的正常进行

实验五:测试unwind

  1. 在实验四的基础上给Page2新建一个controller
  2. 在Page1的controller里加入以下代码,以保证Page2可以返回到Page1
    @IBAction func unwindFromPage2(_ segue: UIStoryboardSegue) {
    print(“调用 unwindFromPage2”)
    }
  3. 在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 函数”)
    }
  4. 编译运行,点击“去页面二”,成功跳转,再点击 “返回 页面一”,成功返回,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


http://www.niftyadmin.cn/n/1228948.html

相关文章

C++11 中的高阶函数

看到了Swift里面有高阶函数map,filter,reduce。发现非常好用,以前写类似的东西要写好多循环。没怎么接触过函数式编程,在网上找了一下C的对应方法,分别为std::transform,std::remove_if,std::accumulate,总结如下: 首…

C++ 如何 int 转 string

写c的时候经常需要做int到string的转换。 下面是最简洁的方法 #include <string> std::string str std::to_string(35); to_string()函数不只能转换int&#xff0c;还可以转换各种float, double数据 c 中的定义如下&#xff1a; _LIBCPP_FUNC_VIS string to_strin…

程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结

程序员面试、算法研究、编程艺术、红黑树4大经典原创系列集锦与总结 作者&#xff1a;July--结构之法算法之道blog之博主。时间&#xff1a;2010年10月-2011年6月。出处&#xff1a;http://blog.csdn.net/v_JULY_v。声明&#xff1a;版权所有&#xff0c;侵犯必究。 前言 开博…

微信小程序开发踩坑指南

微信小程序开发踩坑指南 微信小程序很新&#xff0c;同时也意味着很多坑&#xff0c;特此记录&#xff0c;希望后来者少走弯路。 本文持续不定期更新&#xff08;最后更新2017年01月16日&#xff09; swiper无法显示&#xff0c;需指定宽高才可以正常显示 如果你参照微信官…

'physical corruption' 和'logical corruption' 的区别

physical corruption应该是指 磁盘介质的损坏logical corruption 是指当oracle读一个块时,做块头与块尾的校验,如果不一致,则出logical corruption

如何让 nw.js 支持mp3/mp4

由于版权限制&#xff0c;从nw.js的0.13版本&#xff0c;内置的chrome浏览器就不在默认支持一些受版权保护的音视频格式&#xff0c;如mp3/mp4。 官网说明如下&#xff1a; In the pre-built NW.js, following codecs are supported: theora,vorbis,vp8,pcm_u8,pcm_s16le,pcm_…

六之续、由KMP算法谈到BM算法

六之续、由KMP算法谈到BM算法 作者&#xff1a;滨湖&#xff0c;July、yansha。说明&#xff1a;初稿由滨湖提供&#xff0c;July负责KMP部分的勘误&#xff0c;yansha负责BM部分的修改。全文由July统稿修订完成。出处&#xff1a;http://blog.csdn.net/v_JULY_v。 引言 在此之…

自己开发的微信小程序 -- 《极简追剧》

前几日&#xff0c;微信开放了小程序开发权限&#xff0c;个人开发者终于可以发布小程序了&#xff0c;在可预见的一段时间内&#xff0c;小程序的数量将发生井喷。&#xff08;辛苦审核人员了&#xff09; 我爱看美剧&#xff0c;有时候同时追四五部剧&#xff0c;经常会忘记…