在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\进度条\双表显示\瀑布流 代码设计思路)的更多相关文章

  1. iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)

    在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...

  2. 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:

    小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...

  3. 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条

    混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...

  4. 2019年的代码都写完了吗?不如做个Python进度条看看还剩多少

    我们都知道,进度条是用来直观展示流程所需时间的优秀工具,以免我们担心流程会突然挂掉,而且我们可以用它来预测代码运行是否正常,借助进度条,每个人都能直观地看到脚本最新的进展情况. 如果你之前没用过进度条 ...

  5. ios开发之--编码及命名规范

    做了几年的开发工作,因为是半路出的家,所以对这块一直都没怎么重视,所以在工作中,出现了很多的尴尬场景,编码和命名的规范是一定得有的,最起码一个团队之间的规范也是很有必要的.面向对象的编程,其实很好理解 ...

  6. iOS开发教程:Storyboard全解析-第一部分

    本文转载至http://blog.csdn.net/chang6520/article/details/7945845 感谢原文作者分享     故事版(Storyboard)是一个能够节省你很多设计 ...

  7. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  8. 【零基础学习iOS开发】【01-前言】01-开篇

    本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...

  9. 微信公众账号开发之微信登陆Oauth授权-第一篇

    我曾经在2012年的时候开始研究微信,那时微信的版本还是处于1.0,当时给朋友帮忙做一个基于微信端的web应用,官方的文档是相当少的,百度搜索出来的东西基本也没有多少实用价值,不过是在官网的基础上作了 ...

随机推荐

  1. 入门程序,hello world

    RabbitMQ是消息代理.从本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,它可以根据你给它的路由,缓冲规则进行传递消息. 一.专业术语 1. 生产者: 在现实生活中就好比制造商 ...

  2. iOS扩大UIButton按钮的可点击区域

    一.开发中遇到的问题 我们在开发时有时遇到这中情况:UI给的图片很小,button的点击区域要求比较大.如果用 setBackgroundImage: 方式设置图片会导致图片也跟着button的fra ...

  3. 【web】a标签点击时跳出确认框

    [web]a标签点击时跳出确认框 https://blog.csdn.net/michael_ouyang/article/details/52765575需求如下: 在跳转链接前,需要判断该用户是否 ...

  4. SharePoint 2013 Step by Step——使用自定义的List Template

    Overview 对于企业员工来说,"扁平结构"的LIST是日常操作中经常使用到的,LIST的好处是方便数据的录入以及数据的整理分析,尤其是Quick Edit功能,可以实现快速编 ...

  5. 【转载】java前后端 动静分离,JavaWeb项目为什么我们要放弃jsp?

    原文:http://blog.csdn.net/piantoutongyang/article/details/50878214 今天看到两篇文章,讲解 为什么web开发启用jsp,确实挺有道理,整理 ...

  6. Spring+Mybatis整合过程中找不到.properties文件

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' ...

  7. Processing支持中文显示

    Processing 默认不支持中文,中文显示成框框,我使用的版本是:2.2.1,进行如下设置,并且重启processing就可以支持中文了: 可以看到中文了:

  8. 负载均衡层次结构:LVS Nginx DNS CDN

    文章地址:http://blog.csdn.net/mindfloating/article/details/51020767 作为后端应用的开发者,我们经常开发.调试.测试完我们的应用并发布到生产环 ...

  9. Java:多线程,Exchanger同步器

    1. 背景 类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据.每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收 ...

  10. Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)

    1.基本参数与使用 1.1 常规介绍 使用预计算光照需要在Window/Lighting面板下找到预计算光照选项,保持勾选预计算光照并保证场景中有一个光照静态的物体 此时在编辑器内构建后,预计算光照开 ...