zoukankan      html  css  js  c++  java
  • 简单的链式语法及实际运用(链式编程的基本原理)

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

    所以想到了链式语法,在查询部分资料和尝试后有了这篇日记。
    直接百度的参考文章:
    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的分类会更好用

  • 相关阅读:
    VOA 翻译研讨:2009.2.26 教育报道——在美国学习:网络重新阐释学院之旅
    javac Java 编程语言编译器的使用文档
    在Eclipse中集成Ant编程之配置篇
    ANT使用范例
    MySQL实用命令
    [转]java多线程同步
    Perl 教学 列表和数组变量
    MySql常用命令总结
    MySQL 备份和恢复
    log4j配置详解
  • 原文地址:https://www.cnblogs.com/chzheng/p/7845663.html
Copyright © 2011-2022 走看看