【问题标题】:How to dynamically add a class method?如何动态添加类方法?
【发布时间】:2012-03-11 18:43:12
【问题描述】:

使用 Objective-C 运行时,如何将方法 +layerClass 添加到私有 UIGroupTableViewCellBackground 类(而不是其超类 UIView)?注意:这仅用于测试(查看UITableViewStyleGrouped 如何设置单元格backgroundViewselectedBackgroundView)。

【问题讨论】:

  • 你是在独自一人吗?问/答? 5分钟后你自己发布答案?
  • @samfisher:这是完全合法的做法:meta.stackexchange.com/q/2706Matt 只是添加到信息库中。
  • 感谢@JoshCaswell 对我的启发..!!

标签: objective-c objective-c-runtime


【解决方案1】:

要动态添加类方法,而不是实例方法,请使用object_getClass(cls) 获取元类,然后将方法添加到元类中。例如:

UIKIT_STATIC_INLINE Class my_layerClass(id self, SEL _cmd) {
    return [MyLayer class];
}

+ (void)initialize {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = object_getClass(NSClassFromString(@"UIGroupTableViewCellBackground"));
        NSAssert(class_addMethod(class, @selector(layerClass), (IMP)my_layerClass, "@:@"), nil);
    });
}

您还可以通过将+layerClass 方法添加到UIGroupTableViewCellBackground 类别并使用前向类定义(即@class UIGroupTableViewCellBackground)来编译它,从而更轻松地做到这一点。

【讨论】:

  • 还有#include
【解决方案2】:

试试这个魔法:

#include <objc/runtime.h>

+ (void)load {
    class_addMethod(objc_getMetaClass("UIGroupTableViewCellBackground"), 
        @selector(layerClass), (IMP)my_layerClass, "@:@");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2011-11-15
    • 2013-01-16
    相关资源
    最近更新 更多