Используя среду выполнения Objective-C, как мне добавить метод +layerClass
в закрытый класс UIGroupTableViewCellBackground
(а не в его суперкласс, UIView
)? Примечание. Это только для тестирования (чтобы увидеть, как UITableViewStyleGrouped
устанавливает ячейки backgroundView
и selectedBackgroundView
).
Как динамически добавить метод класса?
comment
ты к себе берешь? вопрос/ответ? опубликовал ответ сам через 5 минут?
- person Saurabh Passolia   schedule 21.02.2012
comment
@samfisher: Это совершенно законно: meta.stackexchange.com/q/2706 Мэтт просто добавляет в хранилище информации.
- person jscs   schedule 21.02.2012
comment
спасибо @JoshCaswell за то, что просветил меня по этому поводу .. !!
- person Saurabh Passolia   schedule 21.02.2012
Ответы (2)
Чтобы динамически добавить метод класса вместо метода экземпляра, используйте 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
, чтобы заставить его скомпилироваться.
person
ma11hew28
schedule
21.02.2012
Также #include ‹objc/runtime.h›
- person Kevin; 12.02.2016
Попробуйте это волшебство:
#include <objc/runtime.h>
+ (void)load {
class_addMethod(objc_getMetaClass("UIGroupTableViewCellBackground"),
@selector(layerClass), (IMP)my_layerClass, "@:@");
}
person
malhal
schedule
01.05.2014