一、我们先把九宫格应用管理的内容再给大家过一下:
1.上一篇文章,咱们实现了一个应用管理这个案例,
我们实现了哪些重要的功能呢:
1)第一个,我们是懒加载这个数组:
//重写apps属性的getter方法,进行懒加载数据
- (NSArray *)apps{
if(_apps == nil){
//1.加载数据,获取app.plist文件在手机上的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@“app.plist” ofType:nil];
//2.根据路径加载数据
NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];
//3.创建一个可变数组,用来保存一个一个的模型对象
NSMutableArray *arrayModels = [NSMutableArray array];//一个空的可变数组
//4.循环字典数组,把每个字典对象转换成一个模型对象
for(NSDictionary *dict in arrayModels){
//1.创建一个模型
TestApp *model = [TestApp appWithDict:dict];
//2.把模型加到arrayModels中
[arrayModels addObject:model];
}
_apps = arrayModels;
}
return _apps;
}
第一个,我们是懒加载这个数据,懒加载数据的时候,因为数据本身是一个字典的这么一个集合,
我们首先把这个字典,存到一个数组里面以后,接下来,我们把字典转成模型,
2)字典转模型的基本思路就是:
1 > 首先,把数据读到一个字典集合,
2> 第二步,循环字典集合里面的每一个字典,把每一个字典,创建一个对应的模型类,然后把字典存进去,把字典中的每一个键对应的值,赋值给这个模型对应的属性,
3> 第三步,把这个模型加到一个模型数组里面,
4> 第四步,接下来,把模型数组都填满以后,赋值给这个_apps集合,返回这个_apps属性,
然后,当我们这个懒加载值完毕以后,然后这个apps集合当中,就保存了一个一个的模型,一个模型,就对应的是一个字典对象的数据,
然后,为什么要叫它懒加载呢,因为当它只有第一次执行的时候,它的这个_apps == nil ,它是一个nil,等于空的话,才会去加载这些数据,当你第二次再调这个getter方法的时候,它这个_apps就不为空了,就不加载数据了,直接把集合是不是给你返回了,
这是我们这个懒加载数据,
2)有我们这个懒加载数据以后呢,紧接着,我们就在这个viewDidLoad,控制器的这个View,加载完毕以后,接下来,我们在里面通过循环的方式,以这个集合apps当中有多少个元素对象,它就创建多少个view,每个view创建好以后,设置view的一些坐标、frame,
- (void)viewDidLoad{
[super viewDidLoad];
//假设每行的应用的个数=3
int columns = 3;
//获取控制器所管理的view的宽度
CGFloat viewWidth = self.view.frame.size.width;
//设置每个应用的宽和高
CGFloat appW = 75;
CGFloat appH = 90;
CGFloat marginTop = 30;//第一行距离顶部的距离,
CGFloat marginX = (viewWidth - columns * appW) / (columns + 1);
CGFloat marginY = marginX;//假设每行之间的间距与marginX相等
for(int i=0;i<self.apps.count;i++){
//获取当前这个应用的数据
TestApp *appModel = self.apps[i];
//1.创建每个应用(UIView)
UIView *appView = [[UIView alloc] init];
//2.设置appView的属性
//2.1 设置appView的frame属性
//计算每个单元格所在的列的索引
int colIdx = i % columns;
//计算每个单元格所在的行的索引
int rowIdx = i / columns;
CGFloat appX = marginX + colIdx * (marginX + appW);
CGFloat appY = marginTop + rowIdx * (marginY+ appH);
appView.frame = CGRectMake(appX,appY,appW,appH);
//3.将appView加到self.view(控制器所管理的那个view)
[self.view addSubview:appView];
//4.向UIView中增加一些子控件
//4.1 增加一个图片框
UIImageView *imgViewIcon = [[UIImageView alloc] init];
//设置frame
CGFloat iconW = 45;
CGFloat iconH = 45;
CGFloat iconX = (appView.frame.size.width - iconW) * 0.5;
CGFloat iconY = 0;
imgViewIcon.frame = CGRectMake(iconX,iconY,iconW,iconH);
//把图片框添加到appView中
[appView addSubview:imgViewIcon];
//设置图片框的数据
imgViewIcon.image = [UIImage imageNamed:appModel.icon];
//4.2 增加一个Label (标签)
//创建Label
UILabel *lblName = [[UILabel alloc] init];
//设置frame
CGFloat nameW = appView.frame.size.width;
CGFloat nameH = 20;
CGFloat nameX = 0;
CGFloat nameY = CGRectGetMaxY(imgViewIcon.frame);
lblName.frame = CGRectMake(nameX,nameY,nameW,nameH);
//添加到appView中
[appView addSubview:lblName];
//设置Label的数据(标题)
lblName.text = appModel.name;
//设置Label的文字的字体大小
lblName.font = [UIFont systemFontOfSize:12];
//设置文字居中对齐
lblName.textAlignment = NSTextAlignmentCenter;
//4.3 添加按钮
UIButton *btnDownload = [[UIButton alloc] init];
CGFloat btnW = iconW;
CGFloat btnH = 20;
CGFloat btnX = iconX;
CGFloat btnY = CGRectGetMaxY(lblName.frame);
btnDownload.frame = CGRectMake(btnX,btnY,btnW,btnH);
[appView addSubview:btnDownload];
[btnDownload setTitle:@“下载” forState:UIControlStateNormal];
[btnDownload setTitle:@“已安装” forState:UIControlStateDisabled];
[btnDownload setBackgroundImage:[UIImage imageNamed:@buttongreen"] forState:UIControlStateNormal];
[btnDownload setBackgroundImage:[UIImage imageNamed:@“buttongreen_highlighted”] forState:UIControlStateHighlighted];
btnDownload.titleLabel.font = [UIFont systemFontOfSize:14];
[btnDownload addTarget:self action:@selector(btnDownloadClick) forControlEvents:UIControlEventTouchUpInside];
}
}
//按钮单击事件
- (void)btnDownloadClick{
NSLog(@“按钮被点击了…”);
}
@end
子控件增加完毕以后,我们从这个集合这个数组里面TestApp *appModel = self.apps[i];取到当前遍历的这套数据,然后把这套数据里的一些数据里面的内容,赋值给我们子控件的一些属性,这样的话,我们这些控件的数据是不是也就有了吧,
然后呢,当都赋值完毕以后,我们这里给按钮注册了一个单击事件,
然后呢,我们运行完毕以后,就是这样的一个效果:


最低0.47元/天 解锁文章
2985

被折叠的 条评论
为什么被折叠?



