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应用,官方的文档是相当少的,百度搜索出来的东西基本也没有多少实用价值,不过是在官网的基础上作了 ...
随机推荐
- 安卓高手之路之ClassLoader(二)
因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...
- Block(一)基础-b
一.概述 Block是C级别的语法和运行时特性.Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存.堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block ...
- 环信集成 2---基于环信Demo3.0,实现单聊功能
这几天在做环信,所以把环信相关的东西拿过来,做个系统点的东西 注意: 这里Demo集成的是带有实时语音功能的(libEaseMobClientSDK.a). 环信库是直接拖拽EaseMobSDK文件夹 ...
- jQuery插件EasyDrag轻松实现JS拖动的效果
jquery.easydrag下载地址:http://ishare.iask.sina.com.cn/f/34289681.html 实现效果图:分布实现一.页面Html标签元素定义 <!doc ...
- JS遍历Table的所有单元格内容
用JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现: 这个方法的参数是唯一标识Table的id,用document对象的获取. function GetInfoFromTable(ta ...
- SharePoint 2013 创建 Site Collection
在之前的文章中,通过SharePoint Central Administration 创建了Web Application.在这篇文章中将继续SharePoint 2013之旅——还是以Step B ...
- jQuery获取对象简单实现方法
监控一个容器,当用户点击时弹出 代码如下 复制代码 $(function(){ $("Element").click{function(){ alert("点击我哦!&q ...
- 像网页开发一样调试ios程序
PonyDebugger https://github.com/square/PonyDebugger
- 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中
一.方法一 访问不同电脑上的数据库(远程访问,只好联好网就一样),如果经常访问或数据量较大,建议用链接服务器方法. 1.创建链接服务器 exec sp_addlinkedserver ‘srv_lnk ...
- Java 8 – Period and Duration examples
Few examples to show you how to use Java 8 Duration, Period and ChronoUnit objects to find out the d ...