iOS开发:代码通用性以及其规范 第一篇(附带,自定义UITextView\进度条\双表显示\瀑布流 代码设计思路)
在iOS团队开发中,我见过一些人的代码,也修改过他们的代码。有的人的代码写的非常之规范、通用,几乎不用交流,就可以知道如何修改以及在它基础上扩展延生。有的人的代码写的很垃圾,一眼看过去,简直会怀疑自己和他是用两种语言在开发,代码可复用性极差,往往一个已写好的功能遇到要扩展(或者让我自己写,在稍微改动的情况下就可以移动其他地方使用)的情况下,需要把他代码全部清掉,自己重新写一个类或者方法出来,反正,改起来,简直就是不能令人愉快的玩耍了。
如果,进入了一家代码不规范的公司,个人建议早走为妙。不然要么以后你坚持自己的风格开发(但是,总要合并吧?总要去处理与自己模块相应的逻辑吧),要么代码风格变成和他们一样,要么将他们代码风格变成和自己的一样。
废话不多说,有闲工夫写这,主要是代码写的太快,没控制好,把一周的任务两天写完了,剩下的时间只好看书、分析、总结以前的东西了,还可以理顺自己设计代码的思路。
个人有个人的代码风格,但规范确是通用的。这次写的博客,主要是分享自己关于代码规范、通用性上得一些心得。
规范这一块,主要分两点,命名规范,其次就是看封装规不规范。
命名规范,我觉得官方的命名很有意思。很多程序员都吐槽OC很乱很糟糕,swift是那么的美好。对swift不作评价,但是说OC很糟糕的人,只怕是没有真正写过多少OC代码吧?没有真正体会过苹果官方代码吧?
事实上,只要参照官方的命名,会发现代码要多优美就有多优美,读起来朗朗上口,写起来非常通顺,当然这是个人感觉。
所以,从命名这样一个角度来说,我觉得只要多看看官方代码命名方式,参照写就好。买一本[Effective Objective-C 2.0] OC开发中的圣书,必看。
至于封装,这个不得不吐槽下,我见过有很多人还把从xib\storyboard里面脱线拉出来的控件全部放在.h文件里面?真心怀疑,到底有没有认真学习过面向对象的思想!除了一些特殊的控件,其他的大部分控件,都是不应该让别的开发者在引用我写的这个类的时候可以肆意改变其中我不想让他改的东西的。
甚至,很多时候,他只能单一的readonly 或者 只允许他更改数据,而不允许他持有控件,但无论如何,从xib\storyboard里面脱线拉出来的控件全部放在.h文件里面,这样做法是错误的(正确的写法,在后面会以代码的形式展示)。
代码的通用性:
这一块,必须要重点提下UITableView,在刚接触UITableView以及MVC模式的时候,我在想,为什么我自己所写的view会依赖于model呢?往往一个view对应一种类型的model,而UITableView却不管放入什么数据(model),都可以正确展示??后来,通过一系列的学习,这个问题也得以解决。
代码的通用性,打算将自己在思考过程中写的几个例子好好分析下,让以后的设计有迹可循。
第一个是,带占位文字的UITextView
第二个是,进度条
第三个是,双表(两个UITableView)
第四个是,自定义的瀑布流
先从UITextView说起,我最开始编写的,通用性较强的控件,就应该是它了,代码:
#import <UIKit/UIKit.h> @interface ZYTextView : UITextView
@property (nonatomic, copy) NSString *placeText;
@property (nonatomic, strong) UIColor *placeTextColor;
@end
#import "ZYTextView.h" @interface ZYTextView ()
@property (nonatomic, weak) UILabel *placeLabel;
@end @implementation ZYTextView - (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) { [self commitInit]; }
return self;
} - (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self commitInit];
}
return self;
} - (void)commitInit
{
UILabel *placeLabel = [[UILabel alloc] init];
placeLabel.text = @"请输入...";
placeLabel.numberOfLines = ; placeLabel.backgroundColor = [UIColor clearColor];
placeLabel.textColor = [UIColor lightGrayColor];
placeLabel.font = [UIFont systemFontOfSize:]; self.font = placeLabel.font;
[self addSubview:placeLabel];
self.placeLabel = placeLabel; // 当用户通过键盘修改了self的文字,self就会自动发出一个UITextViewTextDidChangeNotification通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];
} - (void)setText:(NSString *)text
{
[super setText:text]; [self textDidChange]; //当TextView文字用代码改变时,需要调用,因为通知、代理只能监听键盘、鼠标的事件
} - (void )setAttributedText:(NSAttributedString *)attributedText
{
[super setAttributedText:attributedText]; [self textDidChange];
} - (void)setFont:(UIFont *)font
{
[super setFont:font]; self.placeLabel.font = font; [self setNeedsLayout]; //当TextView字体改变时,palceLabel应该对应改变,改变之后,需要调用layoutSubviews重新计算文字尺寸等
} - (void)setPlaceText:(NSString *)placeText
{
_placeText = [placeText copy]; self.placeLabel.text = _placeText; [self setNeedsLayout]; //占位文字发生改变时,应该重新计算占位文字尺寸
} - (void)setPlaceTextColor:(UIColor *)placeTextColor
{
_placeTextColor = placeTextColor; self.placeLabel.textColor = placeTextColor;
} - (void)layoutSubviews
{
[super layoutSubviews]; CGFloat placeLabelX = ;
CGFloat placeLabelY = ;
CGFloat placeLabelW = self.frame.size.width - * placeLabelX; CGSize tempSize = CGSizeMake(placeLabelW, MAXFLOAT);
CGSize placeSize = [self.placeLabel.text sizeWithFont:self.placeLabel.font constrainedToSize:tempSize];
CGFloat placeLabelH = placeSize.height;
self.placeLabel.frame = CGRectMake(placeLabelX, placeLabelY, placeLabelW, placeLabelH);
} /**
* 监听textView文本框情况
*/
- (void)textDidChange
{
self.placeLabel.hidden = self.hasText;
} - (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
要自定义一个带占位文字的UITexiView是很简单的,就是在TextView里面加载一个UILabel,然后监听键盘的输入,随之判断UILabel是否隐藏。但是要写成通用的TextView,思考的东西就比较多了。
首先,占位文字是应该可以随时让外界改变的,毕竟不可能每个项目的占位文字都是相同的。如果是不规范的写法,可能会将
@property (nonatomic, weak) UILabel *placeLabel;
放在.h文件里面。但是仔细思考,在这样一个TextView里面,我所允许外界修改的只是placeLabel的text属性和textColor属性,其他的,比如说placeLabel显示在哪个位置,以怎么样的形式显示,都应该是由内部掌握,外界不该可以修改,所以必须放在.m文件里面。
然后就是,一般在开发中,很多时候我们都会通过代码(而非键盘输入)给TextView一段字符串,这样的情况下,占位文字是应该消失的,等等其他细节(代码里面已标明)。
都考虑到了之后,还要思考,如果同事用我自定义的这个TextView,会不会有什么不方便的?如果有,请补全......总之,自定义一个View,就是让自己和别人用起来感觉特别方便,这就对了。
iOS开发:代码通用性以及其规范 第一篇(附带,自定义UITextView\进度条\双表显示\瀑布流 代码设计思路)的更多相关文章
- iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)
在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...
- 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:
小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...
- 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条
混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...
- 2019年的代码都写完了吗?不如做个Python进度条看看还剩多少
我们都知道,进度条是用来直观展示流程所需时间的优秀工具,以免我们担心流程会突然挂掉,而且我们可以用它来预测代码运行是否正常,借助进度条,每个人都能直观地看到脚本最新的进展情况. 如果你之前没用过进度条 ...
- ios开发之--编码及命名规范
做了几年的开发工作,因为是半路出的家,所以对这块一直都没怎么重视,所以在工作中,出现了很多的尴尬场景,编码和命名的规范是一定得有的,最起码一个团队之间的规范也是很有必要的.面向对象的编程,其实很好理解 ...
- iOS开发教程:Storyboard全解析-第一部分
本文转载至http://blog.csdn.net/chang6520/article/details/7945845 感谢原文作者分享 故事版(Storyboard)是一个能够节省你很多设计 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇
从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...
- 【零基础学习iOS开发】【01-前言】01-开篇
本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...
- 微信公众账号开发之微信登陆Oauth授权-第一篇
我曾经在2012年的时候开始研究微信,那时微信的版本还是处于1.0,当时给朋友帮忙做一个基于微信端的web应用,官方的文档是相当少的,百度搜索出来的东西基本也没有多少实用价值,不过是在官网的基础上作了 ...
随机推荐
- kubelet源码分析(version: git tag 1.7.6)
一.概述 kubelet源码入口:cmd/kubelet/kubelet.go main() cmd/kubelet/app 包中的Run函数: 查看先参数,kubelet.KubeletDeps t ...
- Activity的onPause()、onStop()和onDestroy()里要做的事情
onPause(): 当系统调用你的activity中的onPause(),从技术上讲,那意味着你的activity仍然处于部分可见的状态,当时大多数时候,那意味着用户正在离开这个activity并马 ...
- Android中ViewPager实现滑动条及与Fragment结合的实例教程
ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...
- java环境变量设置与java查看安装路径
把jdk安装到计算机中之后,我们来进行设置使java环境能够使用. 首先右键点我的电脑.打开属性.然后选择“高级”里面的“环境变量”,在新的打开界面中的系统变量需要设置三个属性“JAVA_HOME”. ...
- 深入理解Python中的yield和send
send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...
- HighCharts实现多数据折线图分列显示
HighCharts实现多数据折线图分列显示 BY ZYZ HighCharts是一个很好用的web端绘图插件,用起来很方便,它的官方支持很好.并且有中文API(不全然).画出来的图像也挺美丽的. 近 ...
- Linux下多路复用IO接口epoll/select/poll的区别
select比epoll效率差的原因:select是轮询,epoll是触发式的,所以效率高. Select: 1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认 ...
- MySQL数据库知识点整理 (持续更新中)
一.修改用户密码 格式(在命令行下输入):mysqladmin -u 用户名 -p旧密码 password 新密码 1. 给root添加密码ab12: mysqladmin -uroot -pass ...
- Android studio的一些常用快捷键
Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如g ...
- hive元数据研究
hive的元数据存放在关系型数据库中,元数据中存储了hive中所有表格的信息,包括表格的名字,表格的字段,字段的类型,注释.这些信息分散的存放在各个表中,给定一个hive中的表格名字,查询这个表中含有 ...