一、storyBoard的使用
StoryBoard的本质是一个xml文件,在编译时生成nib的二进制文件,运行时nib文件被加载并开始创建和实例化GUI元素
使用storyBoard的项目均以初始化storyBoard文件作为整个程序的初始化入口
xib和StoryBoard的对比
相同:都属于IB编程的方式,可以快速创建GUI
不同:xib侧重于单文件编辑,storyBoard侧重于多页面关联。storyBoard可以直观看到页面之间的逻辑,并且所有页面跳转逻辑均可在
-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender方法中完成方便界面间数据统一管理。
这里还有一个问题,如果界面过多,可以放在不同的storyBoard里,逻辑更加清晰,渲染也更快。根据新的storyBoard的名字,就能通过代码得到对应的storyBoard。
1.设置主启动的storyBoard,这两个地方填storyBoard的名字,决定哪个storyBoard是入口,两处修改一处即可,编译时另一处会自动修改
第一图是工程的General中
2.设置应用程序的初始窗体,设置该storyBoard的第一个视图是哪个ViewController
3.在storyBoard中的Controller可以设标识,通过标识在storyBoard中创建视图控制器对象
//得到storyBoard UIStoryboard *tabBarSB = [UIStoryboard storyboardWithName:@"TabBarController" bundle:nil]; //得到VC UITabBarController *tabBarC = [tabBarSB instantiateViewControllerWithIdentifier:@"tabBarC"];
二、storyBoard的跳转和segue
storyBoard页面跳转有两种
1.代码方法使用代码通过segue标识来跳转,segue要提前定义好,要把identifier填好
如果想进行判断后再跳转,比如登录验证,就可以使用下面的方法,但是拉segue的时候就不从button上面拉,选中第一个ViewController,拉到第二个ViewController可以产生一个view到view的segue,通过按钮触发这个segue
通过点击按钮调用下面的方法来触发这个segue
[self performSegueWithIdentifier:@"toSecondSegue" sender:nil];
show:push出下个界面
show Detail:replace
Present Modally:模态出下个界面
Present As Popover:模态推出
Custom:自定义,需要自定义segue
自定义segue
1.新建一个类继承于UIStoryBoardSegue
2.选中前一个视图控制器,连线后选中Custom
3.选中自定义segue,设置segue的identifier和关联类
4.在segue里重写perform方法(界面间跳转默认执行的方法),自定义跳转效果
-(void)perform { //获取当前VC UIViewController *vc_1 = [self sourceViewController]; //目标 UIViewController *vc_2 = [self destinationViewController]; //跳转 [vc_1.navigationController pushViewController:vc_2 animated:YES]; //这里提一下使用加动画的跳转 //如果是两个ViewController之间需要动画跳转,需要将将要出现的VC作为当前VC的子控制器 //否则进行下面的页面切换,新的view上的控件都是不显示的 //这样大家共用一个navigationController [vc_1.navigationController addChildViewController:vc_2]; [vc_1.navigationController.view addSubview:vc_2.view]; //自定义页面切换效果,新的界面的控件不显示 [UIView transitionFromView:vc_1.view toView:vc_2.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromTop completion:nil]; //如果要各自使用不同的navigationController /* UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:vc_2]; [self.navigationController addChildViewController:navC]; [self.navigationController.view addSubview:navC.view]; [UIView transitionFromView:self.navigationController.view toView:navC.view duration:0.25 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; */ }
界面间传值
在跳转时会执行-(void)prepareForSegue:(UIStoryBoardSegue*)segue sender:(id)sender方法
在这个方法里根据不同的segue标识符来完成数据处理
//segue:转场,通过该方法以得到(A push B) A和B //sender:我们点击某个控件触发的跳转动作 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { //这里有个问题,如果控制器有多个segue,要进行判断,不然后续对错误的控制器进行操作,会崩 //判断是哪个segue if ([segue.identifier isEqualToString:@"toSecondSegue"]) { NSLog(@"to detailVC"); //得到发起跳转的ViewController UIViewController *selfController = [segue sourceViewController]; //得到目标ViewController,即将跳转到的ViewController SecondViewController *secondVC = [segue destinationViewController]; secondVC.myTitle = @"1111"; } //还有一种通过storyBoard得到VC的方法,要给视图控制器设置好storyBoardID // UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; // SecondViewController *secondVC = [mainSB instantiateViewControllerWithIdentifier:@"SecondVC"]; //但这种方法赋值不了,下面一句没有效果 // secondVC.myTitle = @"2222"; }
三、storyBoard自定义cell
storyBoard自定义cell的步骤,这个不记少了什么就很烦
如果我们自己拖一个UITableViewController,或者,给一个ViewController上拖一个UITableView,再给UITableView上拖一个UITableViewCell
我们会看到这样的情况,当然,上面的label和button要自己加
以UITableViewController为例
1.先拖一个UITableViewController控件到storyBoard
2.创建一个UITableViewController类
3.将两者关联
4.创建一个UITableViewCell的类,并让它于控件上的CELL关联,这里要注意,一定要点对位置,确定选择了cell
这一看那个拖拉大小的小点,选择了cell一定会出现
5.在storyBoard上给cell添加控件,并与自定义的CustomTableviewCell类关联。
6.在storyBoard创建表视图的方法中,在UITableViewController类中不需要进行cell的注册,导入CustomTableviewCell,直接使用即可
如果使用系统自带的可视化板上的Cell,也是要设置Identifier的,不用注册。
7.其他代理方法与Tableview无异
这里经常出问题,cell没有找到,通常是跳转的方法有问题,要通过mainStoryBoard去找对应的视图控制器,才能对应好prototype cells