//
// TargetActionUtils.swift
// ArtCircle
//
// Created by wupeng on 16/1/20.
//
// http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/?utm_campaign=iOS_Dev_Weekly_Issue_157&utm_medium=email&utm_source=iOS%2BDev%2BWeekly
import UIKit
protocol TargetAction {
func performAction()
}
struct TargetActionWrapper<T: AnyObject> : TargetAction {
weak var target: T?
let action: (T) -> () -> ()
func performAction() -> () {
if let t = target {
action(t)()
}
}
}
enum ControlEvent {
case TouchUpInside
case ValueChanged
// ...
}
class WPButton : UIButton {
var actions = [ControlEvent: TargetAction]()
func wp_setTarget<T: AnyObject>(target: T, action: (T) -> () -> (), controlEvent: ControlEvent) {
actions[controlEvent] = TargetActionWrapper(target: target, action: action)
}
func removeTargetForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent] = nil
}
func performActionForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent]?.performAction()
}
var actionColsure:(() -> Void)?
/**
先使用closure方法避免使用字符串的Selector
- parameter controlEvents: 事件
- parameter actionHandler: 回调函数
*/
func addAction(forControlEvents controlEvents:UIControlEvents = .TouchUpInside, actionHandler:(() -> Void)) {
self.actionColsure = actionHandler
self.addTarget(self, action: Selector("buttonTaped:"), forControlEvents:controlEvents )
}
func buttonTaped(btn:WPButton) {
if self.actionColsure != nil {
self.actionColsure!()
}
}
deinit {
}
}
转载于:https://my.oschina.net/wupengnash/blog/656424