Swift Swizzle

注意点:如果不是 NSObject或者其子类,那么需要将 替换方法前 + dynamic 可动态派发

extension UIButton {

    classfunc Mrshan_swizzleSendAction() {

        struct xxx_swizzleToken {

            staticvar onceToken : dispatch_once_t =0

        }

        //设定这个方法只是执行一次,在第一个uibutton初始化的时候执行这个方法,嘻嘻

        dispatch_once(&xxx_swizzleToken.onceToken) {

            let cls:AnyClass! = UIButton.self

            let originalSelector =Selector("sendAction:to:forEvent:")

            let swizzledSelector =Selector("Mrshan_sendAction:to:forEvent:")

            let originalMethod =class_getInstanceMethod(cls, originalSelector)

            let swizzledMethod =class_getInstanceMethod(cls, swizzledSelector)


            method_exchangeImplementations(originalMethod, swizzledMethod)

            //在这里进行方法实现的替换,下一个页面中的两个方法的互换

            let cls1 =twoViewController.self

            let originSelect1 =Selector("one")

            let swizzleSelect1 =Selector("two")

            let originMethod1 =class_getInstanceMethod(cls1, originSelect1)

            let swizzleMethod1 =class_getInstanceMethod(cls1, swizzleSelect1)

            

            method_exchangeImplementations(originMethod1, swizzleMethod1)

        }

    }

    

    /**

     这个是被调换的方法的实现

     

     - parameter action:   <#action description#>

     - parameter to:       <#to description#>

     - parameter forEvent: <#forEvent description#>

     */

    publicfunc Mrshan_sendAction(action: Selector,

        to: AnyObject!,

        forEvent: UIEvent!)

    {

        //计数器+=1

        xxx_buttonTapCounter.count +=1

        print(xxx_buttonTapCounter.count)

        //这里并不是调用的自己,因为在执行这个方法的时候,Mrshan_sendAction 和 sendAction 的实现已经调换了,所以执行的是原来的button的点击事件

        Mrshan_sendAction(action, to: to, forEvent: forEvent)

    }

    

    /**

     重写构造方法,并且确认构造者是uibutton

     

     - returns: <#return value description#>

     */

    overridepublic classfunc initialize() {

        //别用断言。。老实一点用IF

        ifself != UIButton.self {

            return

        }

        UIButton.Mrshan_swizzleSendAction()

    }

}


/**

 *  button的点击计数器

 */

struct xxx_buttonTapCounter {

    staticvar count: Int =0

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值