2012-02-21 19 views
12

Utilizzando il runtime Objective-C, come si aggiunge il metodo +layerClass alla classe privata UIGroupTableViewCellBackground (non alla sua superclasse, UIView)? Nota: questo è solo per il test (per vedere come imposta la cella backgroundView & selectedBackgroundView).Come aggiungere dinamicamente un metodo di classe?

+0

state prendendo per te stesso? Q/A? risposta inviata da te stesso dopo 5 minuti? – samfisher

+5

@samfisher: Questa è una cosa assolutamente legittima da fare: http://meta.stackexchange.com/q/2706/ Matt sta semplicemente aggiungendo al repository di informazioni. –

+0

grazie @JoshCaswell per avermi illuminato su questo .. !! – samfisher

risposta

16

Per aggiungere dinamicamente un metodo di classe, anziché un metodo di istanza, utilizzare object_getClass(cls) per ottenere la meta classe e quindi aggiungere il metodo alla meta classe. Es .:

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

Si potrebbe anche essere in grado di fare questo più facile con l'aggiunta del metodo +layerClass ad una categoria di UIGroupTableViewCellBackground e l'utilizzo di una definizione di classe in avanti, vale a dire @class UIGroupTableViewCellBackground, per farlo compilare.

+0

Anche #include Kevin

0

Prova questa magia:

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

Il ", nil)" non è corretto, è da un'affermazione. –

Problemi correlati