Подтвердить что ты не робот

Как динамически добавить метод класса?

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

4b9b3361

Ответ 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);
    });
}