30.怎样在Swift中添加运行时属性?
和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中添加运行时属性?的更多相关文章
- servers中添加server时,看不到运行环境的选择。
servers中添加server时,看不到运行环境的选择. 主要原因是tomcat目录中的配置文件格式不对.
- 在Amazon FreeRTOS V10中使用运行时统计信息
在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...
- Visual C++中对运行时库的支持
原文地址:http://blog.csdn.net/wqvbjhc/article/details/6612099 一.什么是C运行时库 1)C运行时库就是 C run-time library,是 ...
- Android Tips: 在给drawable中添加图片资源时,文件名必须全小写
在给drawable中添加图片资源时,文件名必须全小写
- Visual Studio 2008中添加运行按钮 转载
在Visual Studio 2008中添加运行按钮 默认情况下,VS2008中的工具栏上没有运行按钮,只有调试(Debug)按钮,可按照以下方法添加 1.点击菜单Tools(工具)->Cust ...
- [C++]C++中的运行时类型检测
Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...
- 翻译:JVM虚拟机规范1.7中的运行时常量池部分(二)
本篇为JVM虚拟机规范1.7中的运行时常量池部分系列的第二篇. 4.4.4. The CONSTANT_Integer_info and CONSTANT_Float_info Structures ...
- Android中Activity运行时屏幕方向与显示方式详解
现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...
- HTML5Viewer中如何运行时绑定多数据源
很多报表控件提供HTML5Viewer 支持跨设备的报表系统,当然在很多情况下,一个系统可包含多个报表文件,这些报表的数据有可能均为运行时绑定数据源,那么在html5viewer中对一张报表通过重写W ...
随机推荐
- Java自增原子性问题(测试Volatile、AtomicInteger)
这是美团一面面试官的一个问题,后来发现这是一道面试常见题,怪自己没有准备充分:i++;在多线程环境下是否存在问题?当时回答存在,接着问,那怎么解决?...好吧,我说加锁或者synchronized同步 ...
- 设置VMWARE通过桥接方式使用主机无线网卡上网(zz)
环境:WIN7旗舰版,台式机,U盘无线上网卡. 虚拟软件:VMware9.0,虚拟系统:CentOS6.4 需要实现虚拟机以独立机形式工作和上网. 先介绍一下VMware网络设置的三种方式 1 Hos ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- 【剑指offer 面试题47】不用加减乘除做加法
思路: 利用位运算 C++: #include <iostream> using namespace std; int main() { , b = ; int sum, carry; d ...
- matlab的&和&&操作
A&B(1)首先判断A的逻辑值,然后判断B的值,然后进行逻辑与的计算.(2)A和B可以为矩阵(e.g. A=[1 0],B=[0 0]).A&&B(1)首先判断A的逻辑值,如果 ...
- 前端技能汇总 Frontend Knowledge Structure
Frontend Knowledge Structure 项目起源 还记得@jayli 的这幅前端知识结构图么. 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有 ...
- BITED-Windows8应用开发学习札记之四:如何在Win8 应用中实现语义缩放
语意缩放的意义在于:创新的语意缩放外观,让你的应用随时展现信息可视化的力量.如图表般的Tile,随着数据的不同而变化,让你的页面更富节奏.而所谓的语意缩放就是通过上下文的跳转,帮助我们实现一种更快更便 ...
- PySpark操作HBase时设置scan参数
在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算.翻遍了spark的python相关文档,搜遍了google和stackov ...
- *nix高手站点
http://linux.die.net/man/7/ip http://www.neuma.com/ cm+企业开发生命周期管理 http://book.2cto.com/201307/27394 ...
- SharePoint 2013的100个新功能之社交
一:社会能力 SharePoint 2013引入了一个新东西叫做社会能力,使公司组织中的用户社会化协作.我的网站难以置信地做了改进以集成社会能力.除了我的网站,新的社区网站(新闻提要),关注用户和关注 ...