前言:

最近需求作一个公共空间的需求,最后决定用适配器模式来做。

首先,需求是什么?

在我们app中,会有很多列表,tableviewcell的样式会比较统一(当然,我之前在公司那个app不算很大,基本每个列表都会有自己的主题,所以不太会统一,而现在的这个公司的作品主要是以名片为主,所以会设置很多名片的列表,不同情况会有不同规则,但大同小异),UI设计师给出了需要做成公告空间的所有cell,我们经过归类,分成了几种cell,几个cell要满足他给出的所有cell。

为什么会有这样的需求,因为当团队比较大的时候,有多个差不多的view是我们是自己做自己的,这样代码就好很冗余,并且还会有开发中写了一个视图控件但在项目好几个地方都用到了这个控件了,你在给这个视图控件赋值是怎么做呢?

-(void)laodData:(feedModel*)model; ?这样?

这么写没有错,而且很简单。但是有两点不好:

  1. 视图根数据模型有耦合,视图类引入了模型。

2.当你在项目里其他的地方用到了这个视图类,而且对应的模型不再是feedModel了,而是一个新的模型,这个时候你就需要再写一个初始化方法,如果有更多人使用,就会更多。

所以这个时候我们需要使用适配器模式。

那适配器模式是什么?

是将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适用场景:

创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作,为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信.

撸代码了:

#import <Foundation/Foundation.h>

@protocol TNFeedSmallLevelrProtocol <NSObject>
@required
- (NSString *)feedId;
- (NSString *)headImageUrl;
- (NSString *)title;
- (NSString *)subtitle;
- (NSString *)forumLevel; @optional
- (UIEdgeInsets)contentBackgoundViewEdgeInset;
@end
#import "TNSmallLevelCell.h"

@implementation TNSmallLevelCell

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { [self.contentView addSubview:self.contentBackgoundAllView];
[self.contentBackgoundAllView addSubview:self.headImageView];
[self.contentBackgoundAllView addSubview:self.titleLable];
[self.contentBackgoundAllView addSubview:self.subtitleLable];
[self.contentBackgoundAllView addSubview:self.forumLevelView];
self.contentInset = UIEdgeInsetsZero;
[self setNeedsUpdateConstraints];
}
return self;
}
- (void)updateConstraints{ [super updateConstraints]; __weak typeof(self) weakSelf = self; [self.headImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(@12);
make.left.mas_equalTo(weakSelf.contentBackgoundAllView.mas_left).offset(HI(15));
make.size.mas_equalTo(CGSizeMake(40, 40));
make.centerY.mas_equalTo(weakSelf.contentBackgoundAllView.mas_centerY);
}];
[self.titleLable mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(weakSelf.headImageView.mas_right).offset(HI(10));
make.top.mas_equalTo(weakSelf.contentBackgoundAllView.mas_top).offset(WH(16));
make.height.mas_equalTo(16);
make.right.lessThanOrEqualTo(weakSelf.contentBackgoundAllView.mas_right).offset(HI(-53));
}]; [self.subtitleLable mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(weakSelf.titleLable.mas_left);
make.top.mas_equalTo(weakSelf.titleLable.mas_bottom).offset(WH(5));
make.right.lessThanOrEqualTo(weakSelf.contentBackgoundAllView.mas_right).offset(HI(-10));
make.height.mas_equalTo(@14);
}]; [self.forumLevelView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(weakSelf.titleLable.mas_right).offset(HI(5));
make.size.mas_equalTo(CGSizeMake(38, 14));
make.centerY.mas_equalTo(weakSelf.titleLable.mas_centerY);
}];
[self.contentBackgoundAllView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.contentInset);
}];
} - (void)loadData:(id <TNFeedSmallLevelrProtocol>)data{ self.headImageView.imageUrlString = [data headImageUrl];
self.titleLable.text = [data title];
self.subtitleLable.text = [data subtitle];
[self.forumLevelView setTitle:[data forumLevel] forState:UIControlStateNormal];
if ([data respondsToSelector:@selector(contentBackgoundViewEdgeInset)]) {
self.contentInset = [data contentBackgoundViewEdgeInset];
}
} @end
#import "TNNormalAdeapter.h"
#import "TNFeedModel.h" @implementation TNNormalAdeapter
- (instancetype)initWithData:(id)data { if (self = [super init]) { self.data = data;
} return self;
}
- (NSString *)headImageUrl {
TNFeedModel *model = self.data;
return model.headImageUrl;
} - (NSString *)title { TNFeedModel *model = self.data;
return model.title;
} - (NSString *)subtitle { TNFeedModel *model = self.data;
return model.subtitle;
} -(NSString *)forumLevel
{
TNFeedModel *model = self.data;
return model.forumLevel;
} @end
#import <Foundation/Foundation.h>
#import "TNFeedGroupSelfIdentityProtocol.h" @interface TNFeedModel : NSObject
@property (nonatomic, copy)NSString *headImageUrl;
@property (nonatomic, copy)NSString *title;
@property (nonatomic, copy)NSString *subtitle;
@property (nonatomic, copy)NSString *forumLevel;
@property (nonatomic, assign)BOOL subtitleIsShow;
@end

注意几个问题:

1.除了每一个view都需要显示的控件默认显示外,其他控件默认都不显示。(因为,当其他小伙伴用的view是需要什么,他就设置什么属性就可以,他不应该去考虑和他没有关系的任何属性)

2.协议里分 必须实现的 和 非必需实现的 两种属性

需要注意的是:非必需实现的属性用数据的时候需要判断,他是否在适配器里实现了,不然会crash

结语:

互相学习,如果有总结不对的地方,请大家指出。

参考:

https://www.cnblogs.com/YouXianMing/p/4676508.html

http://www.cocoachina.com/ios/20161013/17740.html

适配器模式 iOS的更多相关文章

  1. IOS设计模式之三(适配器模式,观察者模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  2. iOS设计模式之适配器模式

    一,适配器的定义 定义 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 需求场景 需要使用以前开发的“一些现存的对象”,但是新环境中要求 ...

  3. iOS - 适配器模式场景总结

    适配器模式: 1.出现场景 TableViewCell视图层 - 输出 无论NSData怎么变化,数据都可以显示在视图层中. 2.组成结构 输入 - [适配器]- 输出 (数据层) - [适配器]- ...

  4. iOS设计模式解析(三)适配器模式

    适配器模式:将一个类的借口转换成客户端希望的另一个接口 有一个很直观的图: 例如      :电源适配器(将110V电压转换成220V电压,其中Traget是220V电压,adaptee就是110V电 ...

  5. IOS设计模式浅析之适配器模式(Adapter)

    引言 在项目开发中,有时候会遇到这样的一种情景:需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的.怎样应对这种迁移的需求?使得可以复用这些对象,以满足新的应用环境, ...

  6. iOS 底层框架的浅析

    1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...

  7. 李洪强iOS经典面试题140-UI

    李洪强iOS经典面试题140-UI   UI viewcontroller的一些方法的说明viewDidLoad,viewWillDisappear, viewWillAppear方法的 顺序和作用? ...

  8. iOS面试题汇总

    摘要:1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通 ...

  9. iOS进阶面试题----Block部分

    1 什么是block 对于闭包 (block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解.对于刚接触Block的同学,会觉得有些绕, 因为我们习惯写这样的程 ...

随机推荐

  1. constexpr:编译期与运行期之间的神秘关键字

    Scott Meyers在effective modern c++中提到“If there were an award for the most confusing new word in C++11 ...

  2. I/O模型: 阻塞、非阻塞、I/O复用、同步、异步

    I/O模型不论在实际使用还是准备笔试面试中都是重要的内容,参考Unix网络编程进行总结如下.(尤其注意红色标注处) 1. 明确I/O考察的对象和流程 参考Unix网络编程,一个输入操作通常包括两个不同 ...

  3. 一 linux安装python3

    参考 https://www.cnblogs.com/pyyu/p/7402145.html?tdsourcetag=s_pcqq_aiomsg 1 下载 网址:https://www.python. ...

  4. @loj - 6354@「CodePlus 2018 4 月赛」最短路

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 企鹅国中有 N 座城市,编号从 1 到 N . 对于任意的两座城 ...

  5. intellij idea 搜索

    . Ctrl+N 按名字搜索类 相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件 就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配 甚 ...

  6. @noi.ac - 443@ 老头子的话

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 老头子是小学校长,小学生(大哥)们都很听老头子的话.一天,老头子 ...

  7. sublime简介

    Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:多选择,Python插件,代码段等等.完全可自定义键绑定,菜单和工具栏等等.漂亮的用户界 ...

  8. 认识web前端开发

    web前端开发 1.web即web系统,是以网站的形式呈现,通过浏览器的访问来实现一定的功能的系统. 2.什么是前端开发? 前端开发是创建web页面或app等前端界面呈现给用户的过程.通过html.c ...

  9. 最优化方法系列:Adam+SGD-AMSGrad 重点

    https://blog.csdn.net/wishchin/article/details/80567558 自动调参的Adam方法已经非常给力了,不过这主要流行于工程界,在大多数科学实验室中,模型 ...

  10. Logback新版本报no applicable action for [Encoding]问题

    logback.xml配置文件如下: <?xml version="1.0" encoding="UTF-8"?> <configuratio ...