不管在什么项目中总会有一些控件,它们样式相似却根据不同场景又有所不同。虽然也写了一些便利构造函数来快速的创建一些控件,但总感觉不尽人意,想用更少的代码来创建它们。

所以想到了链式语法,在查询部分资料和尝试后有了这篇日记。
直接百度的参考文章:
http://www.jianshu.com/p/a1458a69f72b

作者的总结很精髓
>首先获得实例中的一个block,然后执行block并返回实例本身,然后再执行实例的另一个block,而在这个block中同样返回实例本身,按此规律通过点语法一直往下执行。

接着我试着写了一个简单的可以用于快速创建UIButton的类:

.h文件内容

// Created by chizheng #import <UIKit/UIKit.h>@interface CHZButton : UIButton@property (nonatomic, copy) CHZButton * (^setTitle)(NSString *,UIControlState);@property (nonatomic, copy) CHZButton * (^setTitleColor)(UIColor *,UIControlState);@property (nonatomic, copy) CHZButton * (^setFont)(CGFloat);@property (nonatomic, copy) CHZButton * (^setBackgroundColor)(UIColor *);@property (nonatomic, copy) CHZButton * (^setCornerRadius)(CGFloat);@property (nonatomic, copy) CHZButton * (^setImage)(NSString *,UIControlState);@property (nonatomic, copy) CHZButton * (^addAction)(id,SEL,UIControlEvents);@end

// Created by chizheng #import "CHZButton.h"@implementation CHZButton- (CHZButton * (^)(NSString * title,UIControlState state))setTitle{
return ^(NSString * title,UIControlState state){[self setTitle:title forState:state];return self;
};
}- (CHZButton * (^)(UIColor * titleColor,UIControlState state))setTitleColor{
return ^(UIColor * titleColor,UIControlState state){[self setTitleColor:titleColor forState:state];return self;
};
}- (CHZButton * (^)(CGFloat font))setFont{
return ^(CGFloat font){self.titleLabel.font = [UIFont systemFontOfSize:font];return self;
};
}- (CHZButton * (^)(UIColor * backgroundColor))setBackgroundColor{
return ^(UIColor * backgroundColor){[self setBackgroundColor:backgroundColor];return self;
};
}- (CHZButton * (^)(CGFloat cornerRadius))setCornerRadius{
return ^(CGFloat cornerRadius){self.layer.cornerRadius = cornerRadius;
self.clipsToBounds = YES;return self;
};
}- (CHZButton * (^)(NSString * imageName,UIControlState state))setImage{
return ^(NSString * imageName,UIControlState state){[self setImage:[UIImage imageNamed:imageName] forState:state];return self;
};
}- (CHZButton * (^)(id target,SEL selector,UIControlEvents events))addAction{
return ^(id target,SEL selector,UIControlEvents events){[self addTarget:target action:selector forControlEvents:events];return self;
};
}
@end

创建按钮时只需要如下代码

CHZButton * btn = [CHZButton new];
btn.frame = CGRectMake(Margin_leading, 64, screenW-2*Margin_leading, 44);
btn.setFont(18).setTitle(@"测试按钮", UIControlStateNormal).setBackgroundColor(btn_Color).setCornerRadius(4);
btn.addAction(self, @selector(btnAction:), UIControlEventTouchUpInside);
[self.view addSubview:btn];

后来感觉还是写成UIButton的分类会更好用

转载于:https://www.cnblogs.com/chzheng/p/7845663.html

简单的链式语法及实际运用(链式编程的基本原理)相关推荐

  1. javascript链式语法

    因为 jQuery 库的缘故,链式语法在前端界变得非常流行.实际上这是一种非常容易实现的模式.基本上,你只需要让每个函数返回 'this',这样其他函数就可以立即被调用.看看下面的例子. var bi ...

  2. Python学习笔记 —— 独步天下推导式语法糖

    Python学习笔记 -- 独步天下推导式语法糖 前言 介绍 列表推导式 获取当月天数 字典推导式 模拟三条用户数据 结束语 前言 最近心血来潮,学习了一下Python,其中关于 推导式语法糖 感觉功 ...

  3. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  4. py语法05-可迭代与推导式

    # encoding=utf-8 """ 1.可迭代对象:通过for...in...这类语句迭代读取一条数据供我们使用的对象 2.索引(下标) (1)索引:下标,给序列中 ...

  5. BTC:简单易懂比特币之比特币的神奇——区块链技术的体现

    BTC:简单易懂比特币之比特币的神奇--区块链技术的体现 目录 BTC的七大特殊之处 BTC的七大特殊之处 1.一个没有CEO的公司,管理几十万员工: 2.每个员工自私自利,争权夺利,公司运作9年风生 ...

  6. 简单php文件编写语法

    简单php文件编写语法,老是弄错,做个笔记,经常温习下 1 2 3   1 <?php   2 echo "Test PHP reslove"   3 ?> 1 2 3 ...

  7. 前端使用bootstrap实现一个简单的小案例,重点是关注响应式布局

    1.案例的效果展示 我们使用的是响应式布局,所谓的响应式布局就是可以使得同一套页面可以兼容不同分辨率的设备.可以看到苹果的官网当你将浏览器的串口放的很小的时候网站的布局也会随这页面大小发生变化,当我们 ...

  8. 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷

    使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 posted on 2016-11-14 13:11 lexus ...

  9. 外链式样式表_CSS外链式与内联式的区别是什么

    区别:CSS外链式是将css代码单独写一个以".css"为扩展名的文件中,然后使用link标签链接到html中.CSS内联式是直接使用style属性将css代码写在HTML标签中. ...

最新文章

  1. python页面调用接口_python调用接口——requests模块
  2. 2021年春季学期-信号与系统-第八次作业参考答案-第八小题
  3. 安装APK到android设备那些事儿
  4. isdigit函数python检测数字个数_Python isdecimal isdigit isnumeric区别
  5. SRV05-4二极管参数
  6. boost::date_time模块wrapping_int的测试程序
  7. 实现Java集合迭代的高性能
  8. vb.net datagridview数据批量导入sql_导入:Java实现大批量数据导入导出(100W以上)
  9. iOS之github第三方框架(持续更新)
  10. python 速成学堂_Python 与数据科学入门
  11. java jtextfield 监听_Java JTextField DocumentListener如何用?
  12. PHPCURL直接访问JSONRPC服务
  13. linux valgrind 编译,valgrind 3.9交叉编译
  14. 数据库select语句详解
  15. proteus三输入与门_proteus元件对照
  16. 夕四今晚加班到2点30,而王二还不打算走《打工人的那些事》
  17. 2021-09-10 网安实验-文件修复-BMP图片隐写
  18. 阿里小蜜这一年,经历了哪些技术变迁?
  19. 让我帮你百度一下吧--精简版Github源码
  20. HDU 1517 A Multiplication Game 巴什博弈

热门文章

  1. Silverlight C# 游戏开发:Flyer01开发一个有趣的游戏
  2. 《Excel与VBA开发》一书上市时间
  3. c语言外部中断th0,帮忙看看void int0() interrupt 1 //采用中断0 控制节拍 { TH0=0xd8; TL0=0xef; n--; } 啥意思...
  4. Linux 内核开发 - Eclipse内核开发环境搭建
  5. 教你打造 Android 中的 IOC 框架
  6. shell实例第5讲:检查软件包是否安装
  7. #define与typedef的区别!
  8. C++中为什么要引入抽象基类和纯虚函数?
  9. tomcat源码研究
  10. mysql二: 常用命令