<转>storyboard之 prepareForSegue:sender:

http://leopard168.blog.163.com/blog/static/16847184420142735531836)
在谈到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: ] 来存储数据。 既然提供了存储方式,就有对应的获取的方式。 以技术用语表达,就是: 读写操作是成对出现的。有卖,就有买。呵

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIViewController *destination = segue.destinationViewController;
    if ([destination respondsToSelector:@selector(setDelegate:)]) {
        [destination setValue:self forKey:@"delegate"];
    }
    if ([destination respondsToSelector:@selector(setSelection:)]) {
        // prepare selection info
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        
        id object = self.tasks[indexPath.row];
        NSDictionary *selection = @{@"indexPath" : indexPath,
                                    @"object" : object};
        [destination setValue:selection forKey:@"selection"];
    }
}

前面写的都是铺垫,接下来,我们重点谈下 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 组成的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容