2012-02-21 23 views
12

Usando Objective-C Runtime, ¿cómo agrego el método +layerClass a la clase privada UIGroupTableViewCellBackground (no a su superclase, UIView)? Nota: Esto es solo para pruebas (para ver cómo establece la celda backgroundView & selectedBackgroundView).¿Cómo agregar dinámicamente un método de clase?

+0

está tomando para sí mismo? Q/A? respuesta publicada por ti mismo después de 5 minutos? – samfisher

+5

@samfisher: Esto es algo perfectamente legítimo: http://meta.stackexchange.com/q/2706/ Matt simplemente está agregando al repositorio de información. –

+0

gracias @JoshCaswell por iluminarme en esto .. !! – samfisher

Respuesta

16

Para agregar dinámicamente un método de clase, en lugar de un método de instancia, use object_getClass(cls) para obtener la metaclase y luego agregue el método a la metaclase. Ej .:

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

También podría ser capaz de hacer esto más fácil añadiendo el método +layerClass a una categoría de UIGroupTableViewCellBackground y el uso de una definición de clase hacia adelante, es decir @class UIGroupTableViewCellBackground, para que se compile.

+0

También #include Kevin

0

probar este mágico:

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

El ", nil)" es incorrecto, es de una aserción. –

Cuestiones relacionadas