Используя Objective-C Runtime, как мне добавить метод +layerClass
в частный UIGroupTableViewCellBackground
класс (а не его суперкласс, UIView
)? Примечание. Это только для тестирования (чтобы увидеть, как UITableViewStyleGrouped
устанавливает ячейку backgroundView
и selectedBackgroundView
).
Как динамически добавить метод класса?
Ответ 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
, чтобы его компилировать.
Ответ 2
Попробуйте эту магию:
+ (void)load {
class_addMethod(objc_getMetaClass("UIGroupTableViewCellBackground"),
@selector(layerClass), (IMP)my_layerClass, "@:@"), nil);
});
}