在前面, 我们运用了最简单的方法搞定了美女浏览器, 其中有涉及代码重构, 而代码重构其实就是设计模式的一种, 运用最简单的方法运作繁琐的事情, 这次我们把美女浏览器以MVC设计模式来编程, 在开始之前, 我们先来看看什么是MVC, 其实MVC就是最简单, 最实用的设计模式, 下面让我们来看看:
我们所要遵循的MVC原则就是, 谁的事情归谁做, 比如Controller的事情就由Controller自己做, 整个应用的Controller都由它所管理, 剩下的View和Model也是如此, 这样做的好处就是, 我们所写的代码非常的规整, 也同样方便其他人和我们合作, 还有一个好处就是, MVC三个东西都不知道对方里面有什么, 怎么实现, 只需要怎么去调用就可以了, 这也是MVC最大的好处, 因为三者之前既有联系又相互独立, 离开谁都可以生存, 好了, 下面让我们来看看修改过后的美女浏览器, 首先我们先创建一个数据类:
现在我们来看看代码:
ImageData.h文件
<span style="font-size:12px;">#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface ImagesData : NSObject
// 图像标题
@property (strong, nonatomic) NSString *imageTitle;
// 图像
@property (strong, nonatomic) UIImage *image;
// 使用数据字典初始化对象
- (id)initWithDict:(NSDictionary *)dict;
// 使用文件路径加载图像数据
+ (NSArray *)loadImageDataArrayWithPath:(NSString *)path;
@end</span><span style="font-size: 18px;">
</span>
#import "ImagesData.h"
@implementation ImagesData
- (id)initWithDict:(NSDictionary *)dict
{
self = [super init];
if (self) {
_image = [UIImage imageNamed:dict[@"icon"]];
_imageTitle = dict[@"title"];
}
return self;
}
+ (NSArray *)loadImageDataArrayWithPath:(NSString *)path
{
// 1. 确认Bundle包
NSBundle *bundle = [NSBundle mainBundle];
// 2. 从Bundle包中获取完整文件路径名
NSString *fileName = [bundle pathForResource:path ofType:@"plist"];
// 3. 实例化一个数组,用于返回
NSMutableArray *imageData = [NSMutableArray array];
// 4. 从Plist文件加载数据,到array中
NSArray *array = [NSArray arrayWithContentsOfFile:fileName];
// 5. 循环遍历array,并创建imageData对象,然后添加到数组中
for (NSDictionary *dict in array) {
ImagesData *data = [[ImagesData alloc]initWithDict:dict];
[imageData addObject:data];
}
// 6. 返回数组
return imageData;
}
@end
好了, 我们现在把数据类的代码写完了, 现在我们再回到ViewController.m文件里看看我们修改的代码:
- (void)viewDidLoad {
[super viewDidLoad];
// 1.传入plist文件名
_imagesData = [ImagesData loadImageDataArrayWithPath:@"images"];
// 2.设置默认图片
[self resetPhotoInfoWithIndex:0];
}
- (void)resetPhotoInfoWithIndex:(NSUInteger)index
{
// 1. 设置图像
ImagesData *data = _imagesData[index];
[_imageView setImage:data.image];
// 2. 设置标题
[_imageTitle setText:data.imageTitle];
// 3. 设置序号标签
NSString *numberText = [NSString stringWithFormat:@"%ld/%ld", (index + 1), _imagesData.count];
[_imageNumberLabel setText:numberText];
// 4. 记录照片序号
_photoIndex = index;
}
在这里代码里, 我们顺便把之前的一个小bug解决完, 上一个代码里, 我们还有一个Lable没有实现, 现在我们实现完了, 并且让ViewController工作更少的事情~~~
好了, 这次我们就讲到这里, 下次我们继续~~