Storyboard的类关联和对象创建
storyboard的类管理是非常简单的。我们举一个常用的例子。管理一个viewcontroller。
新建类,如图29-1所示:
然后在storyboard中,拖入viewcontroller进行关联。如图29-2所示:
这样我们的TestViewController就和我们的storyboard的可视化文件进行关联起来了。
storyboard设置根视图控制器
程序启动需要一个根视图控制器,在storyboard中设置根视图控制器是非常简单的。如图30-1所示:
先选中viewcontroller,然后勾选In initial View Controller,然后这个控制器的左侧就会出现一个箭头指向这个视图控制器,这样设置后,系统默认加载的根视图控制器就是我们的选中的控制器了。
系统启动后加载的storyboard
我们启动程序后,系统会默认加载我们的Main.storyboard。其实我们可以更换storyboard。
新建storyboard文件,如图31-1所示:
给我们创建的storyboard起个名字。如图31-2所示:
然后现在系统默认加载的依然是我们的Main.storyboard,我们现在给他更改成我们创建的Test.storyboard。如图31-3所示:
更改完后,系统默认加载的就是我们的Test.Storyboard了。现在有个问题,刚刚我们所说的根视图控制器,指的是系统加载的storyboard中第一个运行的视图控制器。然而我们刚刚指定的Test.storyboard还没有给他指定根视图控制器。那么我们需要给他添加一个viewcontroller然后给他设置成Test.storyboard的根视图控制器。如图31-4所示:
然后这样系统启动后,根视图控制器就是我们Test.storyboard中的MyViewController。
Storyboard类的创建方式
我对可视化编程的类的创建坚持一个原则就不会有问题。就是如果是XIB就用XIB的方式创建,如果是Storyboard就用Storyboard的方式创建,不要用 [[类名 alloc] init]。如果是纯代码编程就用[[类名 alloc] init],坚持这个原则你就不会创建错误。那么Storyboard的类创建有2种方式。
方式一
在storyboard中指定根视图控制器的创建方式(ps:就是带这种箭头的方式创建)如图32-1所示当前这个类的创建。
我们创建一个对象:
引入头文件
#import “TestViewController.h"
TestViewController *testVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateInitialViewController];
这里文件的名字一定要和可视化文件的名字保持一致,尽可能的去复制。如图32-2所示:
方式二
在storyboard中不是根视图控制器的创建,如图33-1所示:我们创建一个Viewcontroller的对象
引入头文件
#import "ViewController.h"
ViewController *hVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@“viewC"];
这里有一个Identifier,我们需要在可视化文件中设置。如图33-2所示:
当然,我们也可以给根视图控制器设置Identifier,也可以第二种方式创建根视图控制器。
XIB的类关联和对象创建
XIB的类管理,大家要认清一点,那个是控制器,那个是视图。认清这一点,XIB的关联就不会有问题。
那么现在咱们举几个例子,让大家明白如何关联类。
关联viewcontroller。
创建一个类,如图34-1所示:
勾选选项卡,系统就会给我们创建好直接关联好的可视化文件。
那么现在我们不勾选,自己来关联。如何来关联UIViewcontroller。
我们选创建一个类,然后如图34-2所示:
然后生成一个可视化文件来进行关联。如图34-2所示:
然后给定可视化文件的名字,这里的名字是可以随便起的,但是在开发过程中,一般会和类文件保持名字一致,方便以后的管理。如图34-3所示:
然后进行类关联。大家认真看,左侧栏的选项卡,有2个非常重要的东西,一个叫File’s Owner 另外一个是View 如图34-4所示:
注意:File’s Owner就是控制器, View就是视图。
一定记住File’s Owner就是控制器,这个前提,你就不会关联错文件。
我们现在去关联。我们要关联的类是一个viewcontroller。也就说,是个控制器。那么现在,我们的需要关联的类就应该选中File’s Owner。然后进行关联。如图34-5所示:
然后,我们现在来理解这个view,这个view就是我们viewcontroller中的self.view。那我们需要把视图给我们的File’s Owner指定。如图34-6所示:
从File’s Owner按住control往View身上拽。然后选择View。这样,viewcontroller中的view就是我们可视化xib文件中的View了。如图34-7所示:
ViewController对象的XIB创建
#import "TestViewController.h"
TestViewController *testVC = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
这里的NibName是XIB的文件名字,如图34-8所示:
UITableViewController的类关联
然后我们做一个类似的UITableViewController关联。
创建一个UITableViewController的类如图35-1所示:
然后创建一个可视化文件进行关联。如图35-2所示:
进行类关联。我们想想看,应该点击那个进行关联类,是view 还是File’s Owner?
UITableViewController也是视图控制器,所以我们一定要选择File’s Owner再进行关联。如图35-3所示:
然后接着想,UITableViewController的view是个什么?是View 还是 Tableview?没错,就是tableview,所以我们要要把View删了。拖拽一个tableview再指定视图。如图35-4所示:
选中View删除。然后拖拽Tableview
然后和之前一样,tableview成为File’s Owner的视图。如图35-5所示:
然后,UITableViewController是实现了tableview的代理方法的,我们需要把tableview的代理设置下。然后大家想想我们的tableview指定代理代码是不是 tableView.dataSource = self;这样指定的,这里的self是不是就是我们TestTableViewController本身。然后我们的File’s Owner是什么?是不是视图控制器。也就是我们的self。所以,这里指定代理。选中View右键,然后拖拽到File’s Owner上。如图35-6所示:
同理也Delegate也指定下吧。这样我们的UITableViewController的类关联就完成了。
![Uploading 22ACD3F9-A157-4D6F-AF68-8BCE58F97218_745948.png . . .]UITableViewController对象XIB的创建
#import "TestTableViewController.h"
TestTableViewController *testTVC = [[TestTableViewController alloc] initWithNibName:@"TestTableViewController" bundle:nil];
这里的NibName也是XIB文件的名字。同上。
UITableViewCell的类关联
UITableViewCell我们在开发中,用的比较多。一般都会选中勾选XIB,让系统帮我们创建,这里我看看如何进行类的关联。
创建一个UITableViewCell的类。这里不再演示,我们直接从关联开始。如图36-1所示:
然后我们的Cell中的视图是我们的UITableViewCell,所以,我们把View可视化文件删掉,拖拽一个UITableViewCell上去。如图36-2所示:
然后进行类关联,我们想想这里我们关联那个文件,是File’s Owner还是可视化文件TableViewCell。UITableViewCell是不是控制器。答案是否,他是个视图,所以这里关联类,我们要选择可视化文件View来进行关联,如图36-3所示:
UITableViewCell的对象创建
UITableViewCell和其他的视图不太一样,UITableViewCell都是要靠重用机制的,这里我只提示一点。storybord中的cell我们可以通过免注册的方式。先让tableView显示一条Cell如图37-1所示:
然后点击cell 进行类的关联,通过identifier就可以免去cell的注册。如图37-2所示:
如果你在storyboard中没有使用cell,想通过xib的cell进行使用的话,cell需要进行注册。
代码如下:
#import “TestTableViewCell.h"
[tableView registerNib:[UINib nibWithNibName:@"TestTableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"];
NibName依然是我们xib文件代码名字。
纯代码方式的cell注册,这里不再介绍。
Storyboard的传值
在我们开发过程中,经常有一些属性传值的情况,而Storyboard是可以直接进行类的跳转的。所以会有一些传值问题。这里主要讲解一个方法。2个例子给大家讲解。
例子1
一个按钮点击进入到二级界面。这里我选择了show,如图38-1所示:
这样点击Button就直接进入到二级页面了,可是这个时候,我们没有写代码,也就意味着,我们传值没有办法实现了,可视化编程传值,是需要通过一个方法的。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
如果你的视图控制器中不存在这个方法,大家可以把他敲出来。
我们说明下这个方法的参数。如图38-2所示:
sender就是指的是点击那个空间点击进入二级页面的。segue指的就是那根连接的线。
segue常用的属性
segue.sourceViewController(一级界面的控制器或者上个控制器)
segue.destinationViewController(二级界面的控制器或者下个控制器)
segue.identifier(标记。用来区分是那条线。我们后面讲这个用处。)
可以根据segue.sourceViewController和segue.destinationViewController来完成传值的效果。这里不再演示。接着我们来讲解identifier的用处
例子2
有一个cell,根据某个值点金让跳转到不同的2个viewcontroller。我们这里拖拽cell就不能实现连接2条线了。拖拽cell只能连接一条线。不能完成2条线。如图38-3所示:
同理我们再拖拽一条到另外一个VC。实现效果如图38-4所示:
之后,我们需要在cell点击的代理方法中,让他进入到不同的线,进入到不同的VC页面。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (YES) {
[self performSegueWithIdentifier:@"fistVC" sender:nil];
}else{
[self performSegueWithIdentifier:@"secondVC" sender:nil];
}
}
这里的performSegueWithIdentifier方法就是让我们的可视化编程进入到不同的线,我这里有2条线,给定不同的标识,这样我就可以控制cell,让他调用不同的线,进入到不同的VC界面。
那么这里的Identifier是在哪设置的呢。如图38-5所示:
一定要先点击其中的一条线,再设置Identifier。同理,把另外一条Identifier设置成secondVC。这里的Identifier就是我们的segue.identifier。
然后在可视化编程跳转的方法中做其他的设置。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"firstVC"]) {
NSLog(@"传值到第一个页面");
}else{
NSLog(@"传值到第二个页面");
}
}
可视化编程就此结束,如果有其他疑问,大家可以在留言区留言,我会及时回复大家,如果有必要我会再补充。