【转】storyboard之 prepareForSegue:sender:

在谈到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(场景)之间的跳转。

时间: 2024-11-06 11:22:48

【转】storyboard之 prepareForSegue:sender:的相关文章

iOS 初次是用storyboard 传值prepareForSegue: sender:方法跳转多个页面 identifier的使用

storyboard的使用有的时候很繁琐....传值方法比较单一..使用起来还是比较头痛....不过你了解之根本就慢慢熟悉它的方式...本人只做笔记不做技术.... 这里是push连接点击这里添加identifier 设置的标示符,这就是区分调转页面的唯一标识,当你触发对应事件的时候, - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法里面用segue 的identifier属性,就会取出对应的NSStr

storyboard 之 prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法的使用方法总结

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

Swift语言Storyboard教程:第二部

本文由CocoaChina翻译小组@TurtleFromMars翻译自raywenderlich,原文:Storyboards Tutorial in Swift: Part 2 更新记录:该Storyboard教程由Caroline Begbie更新iOS 8和Swift相关内容.原文作者为教程编纂组的成员Matthijs Hollemans. 2014/12/5更新:更新至 Xcode 6.2 Beta. 如果你想学习Storyboard,你来对地方了! 在本系列Storyboard教程的第

Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom

一.视图切换类型介绍在storyboard中,segue有几种不同的类型,在iphone和ipad的开发中,segue的类型是不同的.在iphone中,segue有:push,modal,和custom三种不同的类型,这些类型的区别在与新页面出现的方式.而在ipad中,有push,modal,popover,replace和custom五种不同的类型. modal 模态转换最常用的场景,新的场景完全盖住了旧的那个.用户无法再与上一个场景交互,除非他们先关闭这个场景.是在viewControlle

[iOS基础控件 - 6.11.4] storyboard 的 Segue

A.概念 storyboard中的跳转事件连线,都是一个UIStoryboardSegue对象(Segue) 来源控制器 触发控制器 目标控制器 跳转到的控制器 Segue的属性: 每一个Segue对象,都有3个属性唯一标识@property (nonatomic, readonly) NSString *identifier;来源控制器@property (nonatomic, readonly) id sourceViewController;目标控制器 @property (nonatom

Swift Swift语言Storyboard教程:第二部

本文由CocoaChina翻译小组@TurtleFromMars翻译自raywenderlich,原文:Storyboards Tutorial in Swift: Part 2 更新记录:该Storyboard教程由Caroline Begbie更新iOS 8和Swift相关内容.原文作者为教程编纂组的成员Matthijs Hollemans. 2014/12/5更新:更新至 Xcode 6.2 Beta. 如果你想学习Storyboard,你来对地方了! 在本系列Storyboard教程的第

StoryBoard初探(三):自定义Segue以及页面间传值

自定义Segue StoryBoard三种连接中,有一种类型是Custom,开发者可以使用自定义的Segue,自定义Segue类需要继承类UIStoryBoardSegue,并重写perform方法: - (void)perform { NSLog(@"使用自定义连接"); [self.sourceViewController presentViewController:self.destinationViewController animated:YES completion:nil

StoryBoard配置

Storyboard是iOS5的新特性.使用Storyboard可以更方便的管理应用的界面,同时为视图间的跳转提供了清晰的脉络. 任何时候你都可以在你的项目中添加Storyboard,不管你创建项目的时候有没有勾选"Usb Storyboard"选项,如下图所示. 如果你创建的时候勾选了该选项,那么恭喜你,你已经有了一个Storyboard,并且被设为了Main Storyboard,如下图所示. 同时你的代理类是这样的: - (BOOL)application:(UIApplicat

Storyboard初体验(转载)

Storyboard是iOS5的新特性.使用Storyboard可以更方便的管理应用的界面,同时为视图间的跳转提供了清晰的脉络. 任何时候你都可以在你的项目中添加Storyboard,不管你创建项目的时候有没有勾选"Usb Storyboard"选项,如下图所示. 如果你创建的时候勾选了该选项,那么恭喜你,你已经有了一个Storyboard,并且被设为了Main Storyboard,如下图所示. 同时你的代理类是这样的: - (BOOL)application:(UIApplicat