美文网首页
Swift 进击:target/action模式完美转闭包blo

Swift 进击:target/action模式完美转闭包blo

作者: SoaringHeart | 来源:发表于2019-11-07 19:43 被阅读0次

Swift :

@objc public extension UIGestureRecognizer{
    private struct AssociateKeys {
        static var funcName   = "UIGestureRecognizer" + "funcName"
        static var closure    = "UIGestureRecognizer" + "closure"
    }
    
    /// 闭包回调
    func addAction(_ closure: @escaping (UIGestureRecognizer) -> Void) {
        objc_setAssociatedObject(self, &AssociateKeys.closure, closure, .OBJC_ASSOCIATION_COPY_NONATOMIC);
        addTarget(self, action: #selector(p_invoke))
    }
    
    private func p_invoke() {
        if let closure = objc_getAssociatedObject(self, &AssociateKeys.closure) as? ((UIGestureRecognizer) -> Void) {
            closure(self);
        }
    }
    
}

OC :

#import "UIGestureRecognizer+Helper.h"

- (void)addActionBlock:(void(^)(UIGestureRecognizer *reco))block {
    if (!block) {
        return;
    }

    objc_setAssociatedObject(self, _cmd, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(p_invoke:)];
}

- (void)p_invoke:(UIGestureRecognizer *)sender {
    void(^block)(UIGestureRecognizer *reco) = objc_getAssociatedObject(self, @selector(addActionBlock:));
    if (block) {
        block(sender);
    }
}

#import "UIBarButtonItem+Helper.h"

- (void)addActionBlock:(void (^)(UIBarButtonItem *item))block{
    if (block) {
        objc_setAssociatedObject(self, @selector(actionBlock), block, OBJC_ASSOCIATION_COPY);
        // Sets up the action.
        self.target = self;
        self.action = @selector(p_invoke);
    }
}

- (void)p_invoke {
    void(^block)(UIBarButtonItem *item) = objc_getAssociatedObject(self, @selector(addActionBlock:));
    if (block) {
        block(self);
    }
}

相关文章

  • Swift 进击:target/action模式完美转闭包blo

    Swift : OC :

  • 8.19 自定义控件实现功能

    (Target-Action,协议,闭包) 简单控件用闭包 复杂控件用协议 新建一个类ProtocolSlider...

  • 16.闭包的使用

    闭包的介绍 闭包和OC中的block非常相似OC中的block是匿名的函数Swift中的闭包是一个特殊的函数blo...

  • 21 闭包

    闭包的介绍 闭包和OC中的block非常相似OC中的block是匿名的函数Swift中的闭包是一个特殊的函数blo...

  • Swift闭包

    闭包的介绍 闭包和OC中的block非常相似OC中的block是匿名的函数Swift中的闭包是一个特殊的函数blo...

  • 05-Swift闭包(Closures)

    闭包 是自包含的函数代码块,可以在代码中被传递和使用。swift中的闭包和Objective-C中的代码块(blo...

  • Swift闭包

    闭包是功能性自包含模块,可以在代码中被传递和使用。Swift中的闭包与 C 和 Objective-C中的 blo...

  • swift开发利器-RxSwift

    一、为什么要使用RxSwift? 因为使用RxSwift框架我们可以使target-action、代理、闭包回调、...

  • iOS 开发之Target-action模式

    Target-action:目标-动作模式,它贯穿于iOS开发始终。 其实Target-action模式很简单,就...

  • iOS 模块化开发调研

    casa 的方案:Mediator模式 + target-action模式,target就是class,actio...

网友评论

      本文标题:Swift 进击:target/action模式完美转闭包blo

      本文链接:https://www.haomeiwen.com/subject/zwtbbctx.html