zoukankan      html  css  js  c++  java
  • storyboard之 Segue

    在谈到storyboard时,我们多次强调, storyboard 解决的是页面之间的跳转问题。 一个颇为复杂的页面跳转,一旦使用了storyboard,就会四两拨千斤。你只需简单地拖拽,即可完成UIViewController 之间的跳转。 这里面有个神器,一个极为重要的method,它就是:     prepareForSegue:sender:

    从method 简略的表达式,一眼就可看出, 它有2个参数 (arguments)。为什么说呢,因为他有2个冒号嘛。  其实,这个method 的完整表达式为: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    第一个参数是 segue, 第二个参数是 sender。

     这里给出一段代码实例,展示了这个method 的常用方法。 这段code 写在当前的ViewController 对应的.m 文件中。

     这个method 主要解决2个问题:

    (1) 获取所要跳转到的视图控制器 (ViewController);

    (2) 同时,将上一个视图的数据,传递给下一个视图。 (比如: 上一个视图是TableView, 那么,就要将点击cell的行号传递到下一个视图)。

    UIViewController *destination = segue.destinationViewController;   只要是 prepareForSegue:sender: 总会声明一个目标视图控制器(destination viewcontroller);

    获取到下一个视图控制器后, 可以跳转过去了。但仅仅跳转还不够,总得将数据传递过去吧。 比如上一个视图是TableView,当用户点击某个Cell 进入下个页面时,就得将所点击的cell 行号传递给下个页面。

    有一种灵活的传递方法,通过遵循 KVC (Key -Value- Coding)规则来传值。 具体来说, 就是通过 [viewController setValue: forKey: ] 来存储数据。  既然提供了存储方式,就有对应的获取的方式。 以技术用语表达,就是: 读写操作是成对出现的。有卖,就有买。呵  

    <p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="font-size: 14px; line-height: 22px; color: rgb(0, 0, 0);"><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">prepareForSegue</span><span class="pun" style="color: rgb(102, 102, 0);">:(</span><span class="typ" style="color: rgb(102, 0, 102);">UIStoryboardSegue</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*)</span><span class="pln">segue sender</span><span class="pun" style="color: rgb(102, 102, 0);">:(</span><span class="pln">id</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">sender </span><span class="pun" style="color: rgb(102, 102, 0);">{</span>
    <span class="typ" style="color: rgb(102, 0, 102);">UIViewController</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln">destination </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> segue</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">destinationViewController</span><span class="pun" style="color: rgb(102, 102, 0);">;</span>
    <span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">([</span><span class="pln">destination respondsToSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">@selector</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">setDelegate</span><span class="pun" style="color: rgb(102, 102, 0);">:)])</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span>
    <span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">destination setValue</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pln"> forKey</span><span class="pun" style="color: rgb(102, 102, 0);">:@</span><span class="str" style="color: rgb(0, 136, 0);">"delegate"</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
    <span class="pun" style="color: rgb(102, 102, 0);">}</span>
    <span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">([</span><span class="pln">destination respondsToSelector</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">@selector</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">setSelection</span><span class="pun" style="color: rgb(102, 102, 0);">:)])</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span>
    <span class="com" style="color: rgb(136, 0, 0);">// prepare selection info</span>
    <span class="typ" style="color: rgb(102, 0, 102);">NSIndexPath</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln">indexPath </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">tableView indexPathForCell</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">sender</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
    
    <span class="pln">id </span><span class="kwd" style="color: rgb(0, 0, 136);">object</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">self</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">tasks</span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">indexPath</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">row</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
    <span class="typ" style="color: rgb(102, 0, 102);">NSDictionary</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln">selection </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">@{@</span><span class="str" style="color: rgb(0, 136, 0);">"indexPath"</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln"> indexPath</span><span class="pun" style="color: rgb(102, 102, 0);">,</span>
    <span class="pun" style="color: rgb(102, 102, 0);">@</span><span class="str" style="color: rgb(0, 136, 0);">"object"</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">object</span><span class="pun" style="color: rgb(102, 102, 0);">};</span>
    <span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">destination setValue</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">selection forKey</span><span class="pun" style="color: rgb(102, 102, 0);">:@</span><span class="str" style="color: rgb(0, 136, 0);">"selection"</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
    <span class="pun" style="color: rgb(102, 102, 0);">}</span>
    <span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln"> </span></span></p>
    前面写的都是铺垫,接下来,我们重点谈下 prepareForSegue:sender: 的使用。 该方法的触发条件是: 
    当前的视图控制器即将被另一个视图控制器所替代时,segue将处于激活状态,从而调用prepareForSegue:sender: 方法。 
    具体对于TableView来说,当某个cell 被点击时,该cell所对应的segue将被激活,同时,这个method将被调用。我们最关心的数据传递问题, 就是利用这个时机完成的。
    在stroyboard技术出现之前, 数据的传递将通过 tableview delegate 来实现,多少有些麻烦吧。 你可以看到,用storyboard技术,技术这么简单。  当然,你也可以通过button的点击,进入下一个页面。 不管怎样,通过segue就能很轻松地实现视图的跳转。

    回过头来,我们再来仔细看看这个prepareForSegue:sender:  这个神奇的方法。 

    为了区分视图的跳转,可以用上一个、下一个来表示,也可以用源视图、目标视图来表示。 即: sourceViewController 和destinationViewController。  目标视图控制器是指:即将显示(加载)的视图, 而源视图控制器是指:即将被取代的视图控制器。

    写到这里,感觉有点偷懒。 segue虽然实现的是视图之间的跳转,其实是视图控制器之间的切换。 更确切地说,segue 实现的是Secene(场景)之间的跳转。

    Scene 是由:  View 、 ViewController、First Responder、Exit  组成的

  • 相关阅读:
    【C/C++】qsort函数的使用方法和细节
    MOOC C++笔记(五):继承
    MOOC 数据库系统笔记(二):数据库系统的基本结构及其演变发展
    PTA A1015
    MOOC 数据库系统笔记(一):初步认识数据库系统
    PTA A1014
    MOOC C++笔记(四):运算符重载
    PTA A1013
    PTA A1011&A1012
    1.1.22 同样的文档,行数不一样
  • 原文地址:https://www.cnblogs.com/yuqingzhude/p/4927458.html
Copyright © 2011-2022 走看看