2012-02-21 30 views
12

Objective-C Çalışma Zamanı Modunu kullanarak, +layerClass yöntemini özel UIGroupTableViewCellBackground sınıfına nasıl ekleyebilirim (süper sınıf, UIView)? Not: Bu yalnızca test için (hücresinin backgroundView & selectedBackgroundView ayarlarını nasıl yaptığını görmek içindir).Dinamik olarak bir sınıf yöntemi nasıl eklenir?

+0

alıyor: – samfisher

+5

@samfisher: Bu, yapılması gereken tamamen meşru bir şey: http://meta.stackexchange.com/q/2706/ Matt sadece bilgi deposuna ekliyor. –

+0

teşekkürler @JoshCaswell bu konuda aydınlatmak için .. !! – samfisher

cevap

16

Bir sınıf yöntemi yerine, bir örnek yöntemi yerine, meta sınıfı almak için object_getClass(cls) kullanın ve sonra yöntemi meta sınıfına ekleyin. Örn .:

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

Ayrıca bu derlemeye almak için, yani @class UIGroupTableViewCellBackgroundUIGroupTableViewCellBackground bir kategoriye +layerClass yöntemi ekleme ve bir ileri sınıf tanımını kullanarak bu daha kolay yapmak mümkün olabilir. Kendine

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

Ayrıca #include Kevin

0

bu sihri deneyin

? S/A? 5 dakika sonra kendiniz tarafından gönderilen cevap?
+0

", nil" yanlıştır, bir iddiadan. –

İlgili konular