如何动态添加类方法?

发布于 2025-01-07 10:51:52 字数 263 浏览 0 评论 0原文

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

Using the Objective-C Runtime, how do I add the method +layerClass to the private UIGroupTableViewCellBackground class (not to its superclass, UIView)? Note: This is only for testing (to see how UITableViewStyleGrouped sets cell backgroundView & selectedBackgroundView).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虚拟世界 2025-01-14 10:51:52

要动态添加类方法而不是实例方法,请使用 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)来更轻松地完成此操作,让它编译。

To dynamically add a class method, instead of an instance method, use object_getClass(cls) to get the meta class and then add the method to the meta class. E.g.:

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);
    });
}

You might also be able to do this easier by adding the +layerClass method to a category of UIGroupTableViewCellBackground and using a forward class definition, i.e. @class UIGroupTableViewCellBackground, to get it to compile.

聽兲甴掵 2025-01-14 10:51:52

试试这个魔法:

#include <objc/runtime.h>

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

Try this magic:

#include <objc/runtime.h>

+ (void)load {
    class_addMethod(objc_getMetaClass("UIGroupTableViewCellBackground"), 
        @selector(layerClass), (IMP)my_layerClass, "@:@");
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文