适配器模式 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的同学,会觉得有些绕, 因为我们习惯写这样的程 ...
随机推荐
- LeetCode109 Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- SGU 101 Domino【欧拉路径】
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...
- ROS开发过程中遇到:Could not find a package configuration file provided by "qt_build" with any of the following names: qt_buildConfig.cmake qt_build-config.cmake........
最近在搭建QT开发ROS 界面的环境,遇到了很多问题,参考了很多资料,最后发现有些问题其实没有那么复杂,只是我们对整体环境还不了解,熟悉了以后你会发现有些问题就迎刃而解了. 在这个过程中,我首先新建了 ...
- 自定义View系列教程03--onLayout源码详尽分析
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- mysql 中 DATE_ADD(date,INTERVAL expr type)
在Hiredmyway中: SELECT if(LENGTH(company_name) > 30, concat(SUBSTRING(company_nam ...
- oracle函数 nls_charset_id(c1)
[功能]返回字符集名称参应id值 [参数]c1,字符型 [返回]数值型 sql> select nls_charset_id('zhs16gbk') from dual; nls_charset ...
- IP应用加速技术详解:如何提升动静混合站点的访问速率?
全站加速(DCDN)-IPA是阿里云自主研发四层加速产品,它基于TCP/UDP的私有协议提供加速服务,包括解决跨运营商网络不稳定.单线源站.突发流量.网络拥塞等诸多因素导致的延迟高.服务不稳定的问题, ...
- @gym - 101190B@ Binary Code
目录 @description@ @solution@ @accepted code@ @details@ @description@ 我们称一组字符串是 "前缀码",当且仅当不存 ...
- HZOJ 光
一道大模拟,打的我要吐了. 先说一下60%暴力吧,其实模拟光的路线即可,最好还是把边界设为障碍,这样就不用判边界了.最后输出n*m可以骗到10分. 注意不要把n和m弄混(愁死我了). #include ...
- Tyvj 1864 [Poetize I]守卫者的挑战
P1864 [Poetize I]守卫者的挑战时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻 ...