2012-02-21 39 views
12

Sử dụng Thời gian chạy Mục tiêu-C, làm cách nào để thêm phương thức +layerClass vào lớp học riêng tư UIGroupTableViewCellBackground (không phải là siêu lớp, UIView)? Lưu ý: Đây chỉ là để thử nghiệm (để xem cách đặt ô backgroundView & selectedBackgroundView).Cách tự động thêm phương thức lớp học?

+0

được bạn dành cho chính mình? Q/A? đăng câu trả lời của youfself sau 5 phút? – samfisher

+5

@samfisher: Đây là điều hoàn toàn hợp pháp để làm: http://meta.stackexchange.com/q/2706/ Matt chỉ thêm vào kho lưu trữ thông tin. –

+0

cảm ơn @JoshCaswell vì đã khai sáng cho tôi về điều này .. !! – samfisher

Trả lời

16

Để tự động thêm phương thức lớp, thay vì phương pháp thể hiện, hãy sử dụng object_getClass(cls) để lấy lớp meta và sau đó thêm phương thức vào lớp meta. Ví dụ .:

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

Bạn cũng có thể có thể làm dễ dàng hơn này bằng cách thêm phương pháp +layerClass vào một danh mục của UIGroupTableViewCellBackground và sử dụng một định nghĩa lớp về phía trước, ví dụ: @class UIGroupTableViewCellBackground, để có được nó để biên dịch.

+0

Ngoài ra #include Kevin

0

Hãy thử kỳ diệu này:

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

", nil)" không chính xác, từ xác nhận. –

Các vấn đề liên quan