iOS 第三课 九宫格建立 封装以及mvc的初步理解
2015-11-09 23:29
513 查看
1. mvc模式, 数据与 controller,与view的分离
2. 数据与controller分离 懒加载方法 属性get方法运用
3.view与controller分离 属性set方法的运用
总结: 类型的子属性不能显示在其他类中,否则不能叫做封装; 数据的传递需要通过定义 特定的数据属性 进行传递, 且在该属性的set方法中进行子属性的数据设置;
封装: 当一个对象 需要 model 或者 view的时候,此时controler能通过 “接口” 拿到自己想要的 model或者view, 而不知道model从哪里来,或者view中含有什么;
mvc模式: 以controller为中心,controller需要 modelData,以及展示view; 但是modelData数据最终是展示在 view中, 所以controller可以定义 model类型,而将model类型的对象赋予view,那么controller此时仅仅起到联系作用,三者相对独立;
下面以这个例子来总结 封装 以及mvc
1.首先controller 管理 model和view; 要拿到model,以及包含subview;
2.建立controller, 建立属性 NSArray * infos;
controller中的数据采用懒加载的方式,即第一次需要的时候才加载,那么
- (NSArray *) infos
{
if( ! infos )
{
infos = [CZAppInfo appInfo]; //返回数据就行,controller只要数据,不管数据怎么来
}
}
中加载数据最好;
3.controller中只需要最终的数据,不需要知道数据怎么来的,所以用类方法返回数据即可,数据的加载封装在另外的类中,即model
model中
+ (NSArray *) appInfo //负责给出数据, 并且把数据的读取封装在本类中;
{
NSString * path = [[NSBundle
mainBundle] pathForResource:@"app"
ofType:@"plist"];
NSArray * array = [NSArray
arrayWithContentsOfFile:path];
NSMutableArray * arrayInfos = [[NSMutableArray
alloc]
init];
for ( NSDictionary * dic
in array )
{
CZAppInfo * appInfo = [[CZAppInfo
alloc] init];
appInfo.name = [dic
objectForKey:@"name"];
appInfo.icon = [dic
objectForKey:@"icon"];
[arrayInfos
addObject:appInfo];
}
return arrayInfos;
}
4.controller中要根据数据来展示view
首先,view需要组合出控件以满足复杂控件的显示, 只需要在controller中加载view就可以达到显示的正确,而不用管view到底怎么达到显示正确的过程;
- (void) loadSubViews
{
float marginX = (CGRectGetWidth(self.view.bounds)-100*3)/4;
float marginY = 30;
float subWidth = 100;
float subHeight= 100;
NSInteger count = [self.appInfos
count]; //懒加载数据,用到才第一次加载数据
for ( int i=0 ; i<count; i++)
{
//封装自控件,无论子控件内部如何变化,也不影响controller
// UIView * view = [[UIView alloc] init];2''2
CZAppInfoView * view = [[[NSBundle
mainBundle] loadNibNamed:@"CZAppInfoView"
owner:nil
options:nil]
lastObject];
view.appInfo =
self.appInfos[i];
view.frame =
CGRectMake(marginX*(i%3+1)+(i%3)*subWidth, marginY*(i/3+1)+(i/3)*subHeight,
subWidth, subHeight);
[self.view
addSubview:view];
}
}
5.model 与 view的联系
controller的作用是管理model 和view , 所以 model 和view自己的任务 都要封装在自己的类中, controller只负责 拿到model类和view; 并且controller需要传递model给view;
这个时候用model类进行传递最好,在view中定义model类,且在model属性的set'方法中对view中的子属性进行初始化;
首先必须明确: view中的子控件必须是私有成员属性
为什么?因为封装!!!! view的子属性不能暴露给controller,否则封装失败,此时要通过model类的属性来进行数据传递;
view.appInfo =
self.appInfos[i];
//对外的属性:
增加set方法,在对外属性被赋值的时候,对内部属性也进行初始化
- (void) setAppInfo:(CZAppInfo *)appInfo
{
if ( appInfo ) {
_appInfo = appInfo;
_imageView.image = [UIImage
imageNamed:appInfo.icon];
_nameLabel.text = appInfo.name;
[_iconLabel
setTitle:@"下载"
forState:UIControlStateNormal];
}
}
nib的使用: nib用在view的局部控件中,用来组合复杂的控件集合使用,继承自view使用;
nib的加载方法: 相当与在bundle中去加载一个资源文件
CZAppInfoView * view = [[[NSBundle
mainBundle] loadNibNamed:@"CZAppInfoView"
owner:nil
options:nil]
lastObject];
view.appInfo =
self.appInfos[i];
2. 数据与controller分离 懒加载方法 属性get方法运用
3.view与controller分离 属性set方法的运用
总结: 类型的子属性不能显示在其他类中,否则不能叫做封装; 数据的传递需要通过定义 特定的数据属性 进行传递, 且在该属性的set方法中进行子属性的数据设置;
封装: 当一个对象 需要 model 或者 view的时候,此时controler能通过 “接口” 拿到自己想要的 model或者view, 而不知道model从哪里来,或者view中含有什么;
mvc模式: 以controller为中心,controller需要 modelData,以及展示view; 但是modelData数据最终是展示在 view中, 所以controller可以定义 model类型,而将model类型的对象赋予view,那么controller此时仅仅起到联系作用,三者相对独立;
下面以这个例子来总结 封装 以及mvc
1.首先controller 管理 model和view; 要拿到model,以及包含subview;
2.建立controller, 建立属性 NSArray * infos;
controller中的数据采用懒加载的方式,即第一次需要的时候才加载,那么
- (NSArray *) infos
{
if( ! infos )
{
infos = [CZAppInfo appInfo]; //返回数据就行,controller只要数据,不管数据怎么来
}
}
中加载数据最好;
3.controller中只需要最终的数据,不需要知道数据怎么来的,所以用类方法返回数据即可,数据的加载封装在另外的类中,即model
model中
+ (NSArray *) appInfo //负责给出数据, 并且把数据的读取封装在本类中;
{
NSString * path = [[NSBundle
mainBundle] pathForResource:@"app"
ofType:@"plist"];
NSArray * array = [NSArray
arrayWithContentsOfFile:path];
NSMutableArray * arrayInfos = [[NSMutableArray
alloc]
init];
for ( NSDictionary * dic
in array )
{
CZAppInfo * appInfo = [[CZAppInfo
alloc] init];
appInfo.name = [dic
objectForKey:@"name"];
appInfo.icon = [dic
objectForKey:@"icon"];
[arrayInfos
addObject:appInfo];
}
return arrayInfos;
}
4.controller中要根据数据来展示view
首先,view需要组合出控件以满足复杂控件的显示, 只需要在controller中加载view就可以达到显示的正确,而不用管view到底怎么达到显示正确的过程;
- (void) loadSubViews
{
float marginX = (CGRectGetWidth(self.view.bounds)-100*3)/4;
float marginY = 30;
float subWidth = 100;
float subHeight= 100;
NSInteger count = [self.appInfos
count]; //懒加载数据,用到才第一次加载数据
for ( int i=0 ; i<count; i++)
{
//封装自控件,无论子控件内部如何变化,也不影响controller
// UIView * view = [[UIView alloc] init];2''2
CZAppInfoView * view = [[[NSBundle
mainBundle] loadNibNamed:@"CZAppInfoView"
owner:nil
options:nil]
lastObject];
view.appInfo =
self.appInfos[i];
view.frame =
CGRectMake(marginX*(i%3+1)+(i%3)*subWidth, marginY*(i/3+1)+(i/3)*subHeight,
subWidth, subHeight);
[self.view
addSubview:view];
}
}
5.model 与 view的联系
controller的作用是管理model 和view , 所以 model 和view自己的任务 都要封装在自己的类中, controller只负责 拿到model类和view; 并且controller需要传递model给view;
这个时候用model类进行传递最好,在view中定义model类,且在model属性的set'方法中对view中的子属性进行初始化;
首先必须明确: view中的子控件必须是私有成员属性
为什么?因为封装!!!! view的子属性不能暴露给controller,否则封装失败,此时要通过model类的属性来进行数据传递;
view.appInfo =
self.appInfos[i];
//对外的属性:
增加set方法,在对外属性被赋值的时候,对内部属性也进行初始化
- (void) setAppInfo:(CZAppInfo *)appInfo
{
if ( appInfo ) {
_appInfo = appInfo;
_imageView.image = [UIImage
imageNamed:appInfo.icon];
_nameLabel.text = appInfo.name;
[_iconLabel
setTitle:@"下载"
forState:UIControlStateNormal];
}
}
nib的使用: nib用在view的局部控件中,用来组合复杂的控件集合使用,继承自view使用;
nib的加载方法: 相当与在bundle中去加载一个资源文件
CZAppInfoView * view = [[[NSBundle
mainBundle] loadNibNamed:@"CZAppInfoView"
owner:nil
options:nil]
lastObject];
view.appInfo =
self.appInfos[i];
相关文章推荐
- iOS中block的探究
- IOS 调整内存中的图片大小
- iOS GCD
- IOS 自定义控件之-显示下载过程的ImageView
- iOS——oc——多态
- IOS 七种手势详解(动图+Demo下载)
- iOS学习笔记之图片转NSString,再还原
- iOS 获取随机数
- IOS AutoLayout详解(三)用代码实现(附Demo下载)
- iOS中的数据持久化方式
- IOS AutoLayout详解(二)-多动图详解
- IOS AutoLayout详解(一)
- iOS新闻客户端教程5-Home主页
- Charles ios设备抓包
- IOS开发 - 屏幕旋转
- 蓝懿iOS 技术内容交流和学习心得 11.9
- IOS开发之保存图片到Documents目录及PNG,JPEG格式相互转换
- iOS 时间与日期处理
- IOS获取图片的方式以及图片的压缩
- iOS之DDLog打印日志