Как динамически добавить метод класса? - PullRequest
15 голосов
/ 21 февраля 2012

Используя Objective-C Runtime, как добавить метод +layerClass в закрытый класс UIGroupTableViewCellBackground (не в его суперкласс, UIView)? Примечание. Это только для тестирования (чтобы узнать, как UITableViewStyleGrouped устанавливает ячейку backgroundView & selectedBackgroundView).

Ответы [ 2 ]

17 голосов
/ 21 февраля 2012

Чтобы динамически добавить метод класса, вместо метода экземпляра, используйте 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 и используя определение класса forward, то есть @class UIGroupTableViewCellBackground, чтобы получить егокомпилировать.

0 голосов
/ 01 мая 2014

Попробуйте эту магию:

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