和OC一样,Swift中也可以添加运行时属性。下面将提供一个完整的例子,演示如何给按钮点击事件添加运行时属性。

1.示例

import UIKit

var s_GofButtonTouchDownKey = "s_GofButtonTouchDownKey";
var s_GofButtonTouchUpKey = "s_GofButtonTouchUpKey"; extension UIControl
{
/// 按钮TouchDown
var gof_touchDown: GofBtnClickBlock? {
get{
let touchDown = objc_getAssociatedObject(self, &s_GofButtonTouchDownKey);
let dealTouchDown = unsafeBitCast(touchDown, GofBtnClickBlock.self);
return dealTouchDown;
}
set(touchDown)
{
let dealTouchDown: AnyObject = unsafeBitCast(touchDown, AnyObject.self);
objc_setAssociatedObject(self, &s_GofButtonTouchDownKey, dealTouchDown, .OBJC_ASSOCIATION_COPY); self.removeTarget(self, action: #selector(onTouchDown(_:)), forControlEvents: .TouchDown);
self.addTarget(self, action: #selector(onTouchDown(_:)), forControlEvents: .TouchDown)
}
} /// 按钮TouchUpInside
var gof_touchUpInside: GofBtnClickBlock? {
get{
let touchUp = objc_getAssociatedObject(self, &s_GofButtonTouchUpKey);
let dealTouchUp = unsafeBitCast(touchUp, GofBtnClickBlock.self);
return dealTouchUp;
}
set(touchUp)
{
let dealTouchUp: AnyObject = unsafeBitCast(touchUp, AnyObject.self);
objc_setAssociatedObject(self, &s_GofButtonTouchUpKey, dealTouchUp, .OBJC_ASSOCIATION_COPY); self.removeTarget(self, action: #selector(onTouchUp(_:)), forControlEvents: .TouchUpInside);
self.addTarget(self, action: #selector(onTouchUp(_:)), forControlEvents: .TouchUpInside)
}
} /**
按钮TouchDown事件处理 - parameter btn: 按钮
*/
func onTouchDown(btn: UIButton) -> Void
{
let touchDown = self.gof_touchDown; if touchDown != nil
{
touchDown!(btn);
} } /**
按钮TouchUpInside事件处理 - parameter btn: 按钮
*/
func onTouchUp(btn: UIButton) -> Void
{
let touchUp = self.gof_touchUpInside; if touchUp != nil
{
touchUp!(btn);
}
}
}

2.示例说明

  在Swift中,闭包不属于AnyObject,因此,需要做一个相互转换。如下所示:

  使用方式如下:

extension UIButton
{
/**
创建UIButton控件 - parameter title: 按钮标题
- parameter superView: 按钮父视图
- parameter constraints: 约束
- parameter touchup: 按钮点击事件 - returns: UIButton控件
*/
static func gof_buttonWithTitle(title: String?, superView: UIView?, constraints: GofConstraintMaker?, touchup: GofBtnClickBlock?) -> UIButton
{
let button = UIButton(type: .Custom);
if title != nil
{
button.setTitle(title, forState: .Normal);
button.titleLabel?.font = kTitleFont;
} button.backgroundColor = kCColor; if superView != nil
{
superView!.addSubview(button); if constraints != nil
{
button.snp_makeConstraints(closure: { (make) in
constraints!(make);
})
}
} if touchup != nil
{
button.gof_touchUpInside = touchup!;
} return button;
}
}

30.怎样在Swift中添加运行时属性?的更多相关文章

  1. servers中添加server时,看不到运行环境的选择。

    servers中添加server时,看不到运行环境的选择. 主要原因是tomcat目录中的配置文件格式不对.

  2. 在Amazon FreeRTOS V10中使用运行时统计信息

    在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...

  3. Visual C++中对运行时库的支持

    原文地址:http://blog.csdn.net/wqvbjhc/article/details/6612099 一.什么是C运行时库 1)C运行时库就是 C run-time library,是 ...

  4. Android Tips: 在给drawable中添加图片资源时,文件名必须全小写

    在给drawable中添加图片资源时,文件名必须全小写

  5. Visual Studio 2008中添加运行按钮 转载

    在Visual Studio 2008中添加运行按钮 默认情况下,VS2008中的工具栏上没有运行按钮,只有调试(Debug)按钮,可按照以下方法添加 1.点击菜单Tools(工具)->Cust ...

  6. [C++]C++中的运行时类型检测

    Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...

  7. 翻译:JVM虚拟机规范1.7中的运行时常量池部分(二)

    本篇为JVM虚拟机规范1.7中的运行时常量池部分系列的第二篇. 4.4.4. The CONSTANT_Integer_info and CONSTANT_Float_info Structures ...

  8. Android中Activity运行时屏幕方向与显示方式详解

    现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...

  9. HTML5Viewer中如何运行时绑定多数据源

    很多报表控件提供HTML5Viewer 支持跨设备的报表系统,当然在很多情况下,一个系统可包含多个报表文件,这些报表的数据有可能均为运行时绑定数据源,那么在html5viewer中对一张报表通过重写W ...

随机推荐

  1. 【转】Ubuntu 12.04 安装JDK 8和Eclipse

    原文网址:http://blog.csdn.net/yechaodechuntian/article/details/24853813 Ubuntu 12.04 下安装 JDK8 方法一:(缺点是安装 ...

  2. Python使用os.listdir()函数来得目录内容的介绍

    Python编程语言是计算机语言中常用的语言,以下的文章就是介绍在Python编程语言中使用os.listdir()函数来获得目录中的相关内容的介绍,如果你对其相关的实际操作有兴趣的话,你就可以观看以 ...

  3. MySQL与Oracle 差异比较之七用户权限

    用户权限 编号 类别 ORACLE MYSQL 注释 1 创建用户 Create user user_name identified by user_password default tablespa ...

  4. 解析AFNetWorking 网络框架(二)

    转:http://blog.csdn.net/andy_jiangbin/article/details/17114989 接着前面写. 本帖先讲AFURLConnectionOperation,它是 ...

  5. Arduino "Card failed, or not present"(即找不到SD卡)错误解决方案

    http://forum.arduino.cc/index.php?topic=28763.0 Arduino SD自带的例程都是有一个BUG的,必须在pinMode后面加上如下的第二行代码 pinM ...

  6. size_type、size_t、differentce_type以及ptrdiff_t

      目录(?)[-] size_type size_t different_type ptrdiff_t size_t是unsigned类型,用于指明数组长度或下标,它必须是一个正数,std::siz ...

  7. python GUI模块的转变

    Tkinter → tkintertkMessageBox → tkinter.messageboxtkColorChooser → tkinter.colorchoosertkFileDialog ...

  8. VS如何设置OpenCV静态编译

      可以使用opencv提供的静态链接库也可以自己编译静态链接库. 1 使用opencv提供的静态链接库,位置如下图. 首先设置VS配置.有如下几个配置 1 工具->选项->项目和解决方案 ...

  9. Leetcode 210 Course Schedule II

    here are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prere ...

  10. Request、Request.Form、Request.QueryString 用法的区别

    Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的 ...