簡體   English   中英

沒有子類化UIView或UIViewController:是否可以捕獲是否添加了子視圖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM