這是一種方法。這是毛病嗎?是。我建議這樣的行爲?不,但我們都是大人。
要點是你使用method_setImplementation來改變 - [UIView didAddSubview:]的實現,這樣你就可以在被調用時得到通知(並且你會爲willRemoveSubview做同樣的事情:)。不幸的是,你會被調用所有視圖層次結構的變化。你必須添加自己的過濾,以找到你感興趣的具體意見
static void InstallAddSubviewListener(void (^listener)(id _self, UIView* subview))
{
if (listener == NULL)
{
NSLog(@"listener cannot be NULL.");
return;
}
Method addSubviewMethod = class_getInstanceMethod([UIView class], @selector(didAddSubview:));
IMP originalImp = method_getImplementation(addSubviewMethod);
void (^block)(id, UIView*) = ^(id _self, UIView* subview) {
originalImp(_self, @selector(didAddSubview:), subview);
listener(_self, subview);
};
IMP newImp = imp_implementationWithBlock((__bridge void*)block);
method_setImplementation(addSubviewMethod, newImp);
}
要使用,這樣做:由道格@理查森
InstallAddSubviewListener(^(id _self, UIView *subview) {
NSLog(@"-[UIView didAddSubview:] self=%@, view=%@", _self, subview);
});
嘗試以下信息,使用KVO結果:'志願autonotifying只支持-set:返回void的方法。 autonotifying不會被調用 - [WebView _setSuperview:]。我想知道是否有更好的方法來做到這一點,但我還沒有找到任何。 : -/ –
nomothetis
2011-12-13 15:09:57