- Model类进行了数据的封装
- .m文件里面
#import "ZYApp.h"
@implementation ZYApp
//封装数据
+ (NSArray *)apps
{
return [NSArray arrayWithContentsOfFile: [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];
}
@end
View界面类
在xib里面,我们存放了几个控件:
当然我们这里面的控件,可以拖进行就行。
- 但是连线的时候,必须要注意一点,选择你得这个xib属于哪个类来进行管理
- 实现方式是将xib文件的class属性修改为当前自定义的appView类,这样xib文件的类型就是我们所自定义的appView类型,也就可以进行控件的连线了。
在.h文件中:
#import <UIKit/UIKit.h>
@interface ZYAppView : UIView
+ (instancetype)appView;
@property(nonatomic,strong)NSDictionary *dict;
@end
.m文件中
#import "ZYAppView.h"
@interface ZYAppView()
@property (weak, nonatomic) IBOutlet UIImageView *iconVIew;
@property (weak, nonatomic) IBOutlet UILabel *nameLbl;
@end
@implementation ZYAppView
//类方法创建对象
+ (instancetype)appView
{
return [[[NSBundle mainBundle]loadNibNamed:@"ZYAppView" owner:nil options:nil]lastObject];
}
//给子控件赋值
- (void)setDict:(NSDictionary *)dict
{
_dict = dict;
_iconVIew.image = [UIImage imageNamed:dict[@"icon"]];
_nameLbl.text = dict[@"name"];
}
@end
这里一定要注意:使用loadNibNamed后面的参数,不能加后缀。
在ViewController中- 实现懒加载:
@interface ViewController ()
@property(nonatomic,strong)NSArray *apps;
@end
@implementation ViewController
//懒加载
- (NSArray *)apps
{
if (_apps == nil)
{
_apps = [ZYApp apps];
}
return _apps;
}
数据加载的方式:
1.开始就加载当前应用程序中需要的所有数据
- 占据内存空间,但是需要使用数据随时进行操作,效率高
2.需要使用的时候才进行加载
- 节省内存空间,但是需要使用数据的时候需要重新进行数据的获取,效率降低——懒加载——延迟加载
- 实现方式:
- 重写对象的getter方法,因为使用一个对象的时候需要调用
- (void)viewDidLoad {
[super viewDidLoad];
CGFloat padding = 20;
CGFloat appViewWidth = 100;
CGFloat appViewHight = 105;
for (int i = 0 ; i<self.apps.count; i++)
{
CGFloat appViewX = padding + (padding + appViewWidth) * (i %col);
CGFloat appViewY = padding + (padding + appViewHight) * (i / col);
//创建子类appView
ZYAppView *appView = [ZYAppView appView];
//设置子类frame值
appView.frame = CGRectMake(appViewX, appViewY, appView.frame.size.width, appView.frame.size.height);
//给子类得控件 赋值
appView.dict = self.apps[i];
[self.view addSubview:appView];
}
}
@end
使用MVC的好处在于,分工合作,各司其职,好处多多。
效果图:
- 注意事项:
-
- 通过自定义的appView返回的view不再是UIView类型,而是自定义类的类型
- 控件器只做两个事件:获取view 赋值
- 子控件的连线可 在类扩展中实现,这样更安全
- 使用自定义的类描述xib文件,一定要将xib文件的class属性修改为自定义的类,否则不能进行连线。