UIKit基础:12.使用MVC设计模式管理创建美女浏览器
在前面, 我们运用了最简单的方法搞定了美女浏览器, 其中有涉及代码重构, 而代码重构其实就是设计模式的一种, 运用最简单的方法运作繁琐的事情, 这次我们把美女浏览器以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工作更少的事情~~~
好了, 这次我们就讲到这里, 下次我们继续~~