【转】storyboard之 prepareForSegue:sender:

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

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

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

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

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

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

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

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

相关文章
相关标签/搜索