适配器模式 iOS
前言:
最近需求作一个公共空间的需求,最后决定用适配器模式来做。
首先,需求是什么?
在我们app中,会有很多列表,tableviewcell的样式会比较统一(当然,我之前在公司那个app不算很大,基本每个列表都会有自己的主题,所以不太会统一,而现在的这个公司的作品主要是以名片为主,所以会设置很多名片的列表,不同情况会有不同规则,但大同小异),UI设计师给出了需要做成公告空间的所有cell,我们经过归类,分成了几种cell,几个cell要满足他给出的所有cell。
为什么会有这样的需求,因为当团队比较大的时候,有多个差不多的view是我们是自己做自己的,这样代码就好很冗余,并且还会有开发中写了一个视图控件但在项目好几个地方都用到了这个控件了,你在给这个视图控件赋值是怎么做呢?
- -(void)laodData:(feedModel*)model; ?这样?
这么写没有错,而且很简单。但是有两点不好:
视图根数据模型有耦合,视图类引入了模型。
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的更多相关文章
- IOS设计模式之三(适配器模式,观察者模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- iOS设计模式之适配器模式
一,适配器的定义 定义 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 需求场景 需要使用以前开发的“一些现存的对象”,但是新环境中要求 ...
- iOS - 适配器模式场景总结
适配器模式: 1.出现场景 TableViewCell视图层 - 输出 无论NSData怎么变化,数据都可以显示在视图层中. 2.组成结构 输入 - [适配器]- 输出 (数据层) - [适配器]- ...
- iOS设计模式解析(三)适配器模式
适配器模式:将一个类的借口转换成客户端希望的另一个接口 有一个很直观的图: 例如 :电源适配器(将110V电压转换成220V电压,其中Traget是220V电压,adaptee就是110V电 ...
- IOS设计模式浅析之适配器模式(Adapter)
引言 在项目开发中,有时候会遇到这样的一种情景:需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的.怎样应对这种迁移的需求?使得可以复用这些对象,以满足新的应用环境, ...
- iOS 底层框架的浅析
1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...
- 李洪强iOS经典面试题140-UI
李洪强iOS经典面试题140-UI UI viewcontroller的一些方法的说明viewDidLoad,viewWillDisappear, viewWillAppear方法的 顺序和作用? ...
- iOS面试题汇总
摘要:1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通 ...
- iOS进阶面试题----Block部分
1 什么是block 对于闭包 (block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解.对于刚接触Block的同学,会觉得有些绕, 因为我们习惯写这样的程 ...
随机推荐
- Docker Swarm:经济高效的容器调度
本文探讨了几种容器调度策略,并以内存约束为例,讨论了如何利用Docker Swarm,通过资源约束实现容器的合理调度.其中,对容器资源的约束,包括硬约束和软约束,硬约束是指内存资源的实际限制条件,而软 ...
- oracle函数 SUM([distinct|all]x)
[功能]统计数据表选中行x列的合计值. [参数]all表示对所有的值求合计值,distinct只对不同的值求合计值,默认为all 如果有参数distinct或all,需有空格与x(列)隔开. [参数] ...
- HDU_1087-Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- part10.2-字符设备驱动模型
- 防止SyntaxHighlighter.js的闪烁闪一下的方法
SyntaxHighlighter.js是一个代码高亮的JS插件,使用也很简单,但是由于是浏览器段执行JS代码来着色,会出现视觉上闪一下的效果.比如你的20行代码网页打开显示高度为100px,但是Sy ...
- 搭建服务器上的GIT并实现自动同步到站点目录(www)
https://blog.csdn.net/baidu_30000217/article/details/51327289 前言:当我们想要实现几个小伙伴合作开发同一个项目,或者建立一个资源分享平台的 ...
- Codeforces Round #190 (Div. 1 + Div. 2)
A. Ciel and Dancing 模拟. B. Ciel and Flowers 混合类型的数量只能为0.1.2,否则3个可以分成各种类型各自合成. C. Ciel and Robot 考虑一组 ...
- laravel安装intervention/image图像处理扩展 报错 intervention/image 2.3.7 requires ext-fileinfo
在安装intervention/image图像处理扩展 报错fileinfo is missing 报错信息如下: \blog>composer require intervention/ima ...
- 给websocket加入心跳包防止自动断开连接
var userId=$("#userId").val(); var lockReconnect = false; //避免ws重复连接 var ws = null; // 判断当 ...
- 关于Android studio Haxm加速器安装
首先,在SDK manager中要安装如下选项 安装后,在启动虚拟机时如果提示你没有Install Haxm,在目录sdk\extras\intel\Hardware_Accelerated_Exec ...