适配器模式 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的同学,会觉得有些绕, 因为我们习惯写这样的程 ...
随机推荐
- php配置文件php.ini中文详解
转自:http://www.cnblogs.com/hbl/archive/2008/02/15/1069367.html [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而p ...
- mysql字段中提取汉字,去除数字以及字母
如果只是删除尾部的中文,保留数据,可以用以下的简单方式 MySQL as num; +------+ | num | +------+ | +------+ DELIMITER $$ DROP FUN ...
- tensorflow兼容处理 tensorflow.compat.v1
https://www.wandouip.com/t5i183316/ 引言 原来引用过一个段子,这里还要再引用一次.是关于苹果的.大意是,苹果发布了新的开发语言Swift,有非常多优秀的特征,于是很 ...
- Python基础:01Python标准类型分类
有三种不同的模式可以帮助我们对基本类型进行分类,每种模型都展示了这些类型之间的相互关系. 一:存储模式 这种分类模式,看这种类型的对象能保存多少个对象. 一个能保存单个字面对象的类型称为原子或标量存储 ...
- LeetCode73 Set Matrix Zeroes
题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.(Me ...
- DataTable CAST 成集合后,进行自定义排序再转换回DataTable
dt = dt.Rows.Cast<DataRow>().OrderBy(r => Convert.ToInt32(r["数量"])==0?1:0).ThenBy ...
- 根据User Agent参数的各个字段Mozilla/5.0/4.0-AppleWebKit/Chrome/Safari/Firefox/Opera/MSIE来确定/判断客户端使用什么浏览器
下面给你一一解答以及给你介绍: //Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like ...
- Project Euler Problem 12-Highly divisible triangular number
最直接的想法就是暴力搞搞,直接枚举,暴力分解因子.再好一点,就打个素数表来分解因子.假设num=p1^a1p2^a2...pn^an,则所有因子个数为(a1+1)(a2+1)...(an+1). 再好 ...
- 使用国内阿里maven私服方法
方法1,在maven的config下setings.xml文件中加入以下代码 <mirrors> <mirror> <id>mirrorId</id> ...
- MVC插件式开发平台
---恢复内容开始--- 经过DyOS.BraveOS1.0再到BraveOS2.0,系统现在已经开发了下载. 我们的目标是,网页版操作系统,可以在线安装更新软件,并提供二次开发平台,提供基础的逻辑和 ...