一、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];
2.直接拖拽,拖拽按钮的连线关联两个页面,会产生一条关联线segue,不需要添加相应方法
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无异