IOS开发: storyboard之 prepareForSegue:sender: && 设置为跟控制器
2016-01-28 16:18
399 查看
在谈到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: ] 来存储数据。 既然提供了存储方式,就有对应的获取的方式。 以技术用语表达,就是: 读写操作是成对出现的。有卖,就有买。呵
回过头来,我们再来仔细看看这个prepareForSegue:sender: 这个神奇的方法。
为了区分视图的跳转,可以用上一个、下一个来表示,也可以用源视图、目标视图来表示。 即: sourceViewController 和destinationViewController。 目标视图控制器是指:即将显示(加载)的视图, 而源视图控制器是指:即将被取代的视图控制器。
写到这里,感觉有点偷懒。 segue虽然实现的是视图之间的跳转,其实是视图控制器之间的切换。 更确切地说,segue 实现的是Secene(场景)之间的跳转。
Scene 是由: View 、 ViewController、First Responder、Exit 组成的。
步骤:
(1)加载storyboard
(2)创建控制器
(3)把控制器设置为Window的根控制器
从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 组成的。
#import "YYAppDelegate.h" 2 #import "YYViewController.h" 3 4 @implementation YYAppDelegate 5 6 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 7 { 8 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 9 self.window.backgroundColor = [UIColor whiteColor]; 10 11 // YYViewController *controller=[[YYViewController alloc]init]; 12 13 //1.加载storyboard,(注意:这里仅仅是加载名称为test的storyboard,并不会创建storyboard中的控制器和控件) 14 UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"test" bundle:nil]; 15 16 //2.下面这个方法代表着创建storyboard中箭头指向的控制器(初始控制器) 17 YYViewController *controller=[storyboard instantiateInitialViewController]; 18 19 //参考 20 // UINib *nib=[UINib nibWithNibName:@"test" bundle:nil]; 21 // [nib instantiateWithOwner:nil options:nil]; 22 23 //3.设置控制器为Window的根控制器 24 self.window.rootViewController=controller; 25 26 [self.window makeKeyAndVisible]; 27 return YES; 28 } 复制代码
步骤:
(1)加载storyboard
(2)创建控制器
(3)把控制器设置为Window的根控制器
相关文章推荐
- 从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)
- 结构体和NSValue的转换
- 《iOS Human Interface Guidelines》——Sound
- UVA 11538 Chess Queen
- call requires permission which may be rejected by user;code should explicitly check to see if permis
- UIImageView的属性
- iOS UIView头文件部分翻译
- string.valueof和string 的区别 遇到错误才记忆深刻
- Bluetooth程序设计
- 俺的交互设计理念
- Android只有主线程才能更新UI?
- iOS UIView&CALayer
- UIView-动画
- requestAnimationFrame()
- iOS开发 贝塞尔曲线UIBezierPath
- poj1947 Rebuilding Roads 树形dp 背包
- iOS Storyboard、xib中的UIScrollView使用autolayout
- IOS截屏一个UIView,以png或者jpg格式保存到指定目录下
- iOS UITableView 里的Cell用Xib实现
- 使用UISearchController 实现搜索框