UIKit基础:12.使用MVC设计模式管理创建美女浏览器

在前面, 我们运用了最简单的方法搞定了美女浏览器, 其中有涉及代码重构, 而代码重构其实就是设计模式的一种, 运用最简单的方法运作繁琐的事情, 这次我们把美女浏览器以MVC设计模式来编程, 在开始之前, 我们先来看看什么是MVC, 其实MVC就是最简单, 最实用的设计模式, 下面让我们来看看:


我们所要遵循的MVC原则就是, 谁的事情归谁做, 比如Controller的事情就由Controller自己做, 整个应用的Controller都由它所管理, 剩下的ViewModel也是如此, 这样做的好处就是, 我们所写的代码非常的规整, 也同样方便其他人和我们合作, 还有一个好处就是, 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>


ImageData.m文件
#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工作更少的事情~~~



好了, 这次我们就讲到这里, 下次我们继续~~

原文地址:https://www.cnblogs.com/iOSCain/p/4333155.html