[英]Without subclassing a UIView or UIViewController: possible to catch if a subview was added?
如果將視圖作為子視圖添加到控制器的現有視圖,是否可以捕獲事件或通知? 我在這里有一個庫,我不能子類化,但是需要知道是否添加了特定的子視圖來觸發自定義操作。 有機會嗎?
我將嘗試為didAddSubview
方法添加類別。
編輯
類別是子類的替代方法,因此您可以沿以下方式使用:
。H:
#import <UIkit/UIKit.h>
@interface UIView (AddSubView)
- (void)didAddSubview:(UIView *)view
@end
.m:
@implementation UIView (AddSubView)
- (void)didAddSubview:(UIView *)view
{
[self addSubview: view];
// invoke the method you want to notify the addition of the subview
}
@end
我並不是說這種方法比@tiguero建議的方法更干凈,但我認為它稍微安全一些(請參閱為什么在他對他的回答中使用類別可能很危險)並為您提供更多的靈活性。
盡管不完全正確,但在某種程度上,這還是KVO的工作原理。 基本上,您可以動態更改willMoveToSuperview
的實現,並將通知代碼添加到其中。
//Makes views announce their change of superviews
Method method = class_getInstanceMethod([UIView class], @selector(willMoveToSuperview:));
IMP originalImp = method_getImplementation(method);
void (^block)(id, UIView*) = ^(id _self, UIView* superview) {
[_self willChangeValueForKey:@"superview"];
originalImp(_self, @selector(willMoveToSuperview:), superview);
[_self didChangeValueForKey:@"superview"];
};
IMP newImp = imp_implementationWithBlock((__bridge void*)block);
method_setImplementation(method, newImp);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.