[IOS]关于segue原理机制的理解

因为接触IOS比较晚,接触的时候Xcode就已经有了storyboard这个东西,好处是在搞segue的时候可以省去很多手写代码,但是不好的就是会让人不理解segue的具体运作机制和原理.经过网上查了各种资料,有了一点粗粗的理解,其中虽然有很多理解的还是比较模糊.大家看看,有哪里不对,希望指出.

其实无论是何种segue(push,modal或是customer,更或者是后来新加的unwind),主要原理都是遵循如下几个步骤:

1. 触发segue事件

触发segue有很多中方式,目前最常见的就是在storyboard上进行拉线,直接把某个button, control+拖曳至某个scene,这种方式我的理解是,当用户点击该button的时候,UIkit会创建一个UIStoryboardSegue的对象(当然像unwind的segue方式在创建具体segue对象之前可能会先做各种事情,具体可见http://blog.csdn.net/nogodoss/article/details/41823195),同时会进行初始化该对象里面一些具体信息,比如sourceViewController的对象实例,targetViewController的对象实例,identifier的值(该值可以在storyboard上进行定义)等等.除了直接通过storyboard上进行触发,当然也可以在代码里手动触发,比如先将一个button的IBaction关联到viewController上,然后在该IBaction方法中调用performSegueWithIdentifier:sender:来触发,触发之后,该方法实现的东西我估计应该和前面一种直接在storyboard上拉线触发差不多.

2.触发segue事件之后具体做的一些步骤

具体的一些动作可能依据不同的segue方式有所不同,但是无论是哪种segue,他们肯定会做如下几个步骤,会调用sourceViewController对象的prepareForSegue:sender:方法,然后最终执行Segue实例中的perform方法来达到具体的切换.


下面针对其中几个细节我具体说明下我的一些理解:

1. 关于Segue实例中的perform方法,根据我的理解,push或是modal或是customer或是unwind的不同正是因为这个方法的不同导致(回忆一下如果你要用自己的customer的segue就一定得重写perform方式的原因,可能就是因为这点);对于push的perform实现没有具体研究过,但是估计也不会太难;对于modal的方式,应该其perform主要做的就是调用了sourceViewController对象的presentViewController:animated:completion:方法来达到;而对于unwind方式,因为unwind方式的前提是当前的sourceVIew是之前从别的view中segue过来的(关于这点我在第二点中会说明),所以他的perform实现就是调用sourceViewController对象的dismissViewControllerAnimated:completion:方法来达到隐藏当前的view,回到以前的view从而让人感觉就是从当前的这个view直接segue到以前的那个view一样了.

2.在第一点中我所说的unwind方式的前提是当前的sourceVIew是之前从别的view中segue过来的这是我实验之后的猜测,首先我在storyboard上分别添加了3个viewController,分别定义为view1,view2,view3;然后分别在view1和view的controller中定义(IBAction)back1:(UIStoryboardSegue *)segue {}和(IBAction)back2:(UIStoryboardSegue *)segue {}两个方法供unwind来连接,接着在view3中加两个button分别unwind至back1和back2方法,然后将view3作为entryPoint,注意此时view1,view2和view3之间除了前面两个unwind之后没有任何segue的跳转,此时我发现在模拟器中点击view3中的两个button没反应.然后我把entryPoint设置为view1,同时在view1中添加一个button,modal的方式跳转到view3,此时再在view3上点击button1可以回到view1,但是点击button2还是没反应,所以我才猜测要实现unwind的方式必须得在直接有创建过target的view,即当前的unwind的source VIew必须是从target VIew直接或者间接跳转过来的.



以上纯粹我个人看法,非常欢迎专业人士指出问题,这样也就不会有人受误导了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值