动态加载XIB 高级应用
Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有动态类型(Dynamic typing),动态绑定(Dynamic binding)和动态加载(Dynamic loading)。
而我今天与大家分享的就是关于动态加载的一些用法,其他两个想必也是经常用到的,在这也就不多说了。
所谓,动态加载,就是在程序运行当中,根据需要动态地加载一些视图,常常用在,游戏等多视图的应用中,当然如果有需要,可以用在任何场景中。
动态加载用到的一个类就是NSBundle UIKit Additions Reference对NSBundle的一个扩展。
其中只有一个方法:– loadNibNamed:owner:options:加载XIB文件
看看我写的DEMO
现在假定大家对interface builder 比较熟悉
第一步:
首先我们创建一个single view application
第二步:
在XIB 文件中我们拖进去一个Button ,名字为加载视图,并设置好action
- (IBAction)loadNewView:(id)sender;
第三步:
新建一个空的XIB 文件
至此,工程结构很简单
第四步:
打开我们新建的那个XIB文件 ,我现在想拖进去一个UIView 设置好大小(也可以在加载的时候设置其frame),点击file's owner 设置其所有者为sdsViewController,这个就不用多解释了,用过interface builder的都明白。
sdsViewController这个类关联了两个XIB 文件
视图如图所示:现在 我们可以在这个新加载的视图里面处理我们的即时需求,那么我们现在就可以通过代码,来加载这一个视图了。
打开- (IBAction)loadNewView:(id)sender; 添加以下几行代码:
if (!isLoadingView) {
NSArray *nibViews=[[NSBundle mainBundle] loadNibNamed:@"Empty" owner:self options:nil]; //通过这个方法,取得我们的视图
subView=[nibViews objectAtIndex:0];
subView.frame=CGRectMake(0, 0, 320, 160); //设置frame
[self.view addSubview:subView]; //添加
isLoadingView=true;
} else{
NSLog(@"视图已经加载");
}
判断句:保证点击按钮的时候,只加载一次,如果不加限制,会不断地进行加载,这个都懂得。
点击加载页面 哈哈,成功加载到我们需要的新视图了。
那我们处理完成即时需求后怎么,回到主场景中去呢,这个很简单,想必大家都会。
为完成按钮,添加点击事件
然后添加代码:
[subView removeFromSuperview]; //从父视图中移除就可以了,
isLoadingView=false; //视图没有加载,
NSLog(@"视图已经移除");
至此,动态加载视图的DEMO就演示完毕了,总结起来就是一个方法– loadNibNamed:owner:options:加载XIB文件
但其用处可是很广泛的,灵活之处在于大家平时,多多地去琢磨。
优点:灵活,代码量少,程序结构清楚。
思考:通过在程序中动态地加载视图,我们可以做很多事情,比如说,我们可以自己实现系统的UIAlertView ,实现自己任何想实现的视图,等等吧。好处就是,实现更多的功能,但我们写代码的量却不是很多。善于利用IOS这几种动态特性,有助于我们的程序更加灵活。有助于我们创造出更加丰富多彩的应用。
关于XIB 与storyBorad更高级的一下用法,请持续关注我的更新,关注我的博文。也希望大家,多多交流,踊跃发言。