Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 没有子类化UIView或UIViewController:如果添加了子视图,是否可能捕获?_Objective C_Ios_Uikit - Fatal编程技术网

Objective c 没有子类化UIView或UIViewController:如果添加了子视图,是否可能捕获?

Objective c 没有子类化UIView或UIViewController:如果添加了子视图,是否可能捕获?,objective-c,ios,uikit,Objective C,Ios,Uikit,如果视图作为子视图添加到控制器的现有视图中,是否有方法捕获事件或通知?我这里有一个库,我不能子类化,但需要知道是否添加了特定的子视图来触发自定义操作。 有可能吗?我将尝试为didAddSubview方法添加一个类别 编辑 Category是子类化的另一种选择,因此您可以使用以下内容: .h: 我将尝试为didAddSubview方法添加一个类别 编辑 Category是子类化的另一种选择,因此您可以使用以下内容: .h: 并不是说我认为这个方法比@tiguero建议的方法更干净,而是我认为它稍微

如果视图作为子视图添加到控制器的现有视图中,是否有方法捕获事件或通知?我这里有一个库,我不能子类化,但需要知道是否添加了特定的子视图来触发自定义操作。
有可能吗?

我将尝试为
didAddSubview
方法添加一个类别

编辑

Category是子类化的另一种选择,因此您可以使用以下内容:

.h:


我将尝试为
didAddSubview
方法添加一个类别

编辑

Category是子类化的另一种选择,因此您可以使用以下内容:

.h:


并不是说我认为这个方法比@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);

并不是说我认为这个方法比@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);

我不知道。怎么样?:-)我的意思是:你能提供一些示例代码吗?不太推荐。这就是为什么:@瓦伦蒂拉图感谢你指出这一点:当我提到的目的使用类别时,肯定有一些缺点需要考虑,但在这种情况下呢?你会有更好的选择吗?是的,在某种程度上,但涉及一些运行时练习,看看我的答案。据我所知,没有可靠的。KVO肯定是不可靠的,因为只要一个属性没有被记录为KVO,即使它现在可以工作,它可能会在将来的更新中崩溃。我不知道。怎么样?:-)我的意思是:你能提供一些示例代码吗?不太推荐。这就是为什么:@瓦伦蒂拉图感谢你指出这一点:当我提到的目的使用类别时,肯定有一些缺点需要考虑,但在这种情况下呢?你会有更好的选择吗?是的,在某种程度上,但涉及一些运行时练习,看看我的答案。据我所知,没有可靠的。KVO肯定是不可靠的,因为只要一个属性没有被记录为KVO,即使它现在可以工作,它也可能在将来的更新中崩溃。哇。那看起来很粗糙。应用商店会接受这一点吗?因为它似乎是肮脏方法中的清洁剂,以前也曾使用过,所以被接受,如下所示:是的,我过去使用过,我的应用通过了验证。最重要的是,我看不出他们会试图阻止你的理由,这不是私有API,只是,有点尴尬,但如果你仔细想想,它也很强大。哇。那看起来很粗糙。应用商店会接受这一点吗?因为它似乎是肮脏方法中的清洁剂,以前也曾使用过,所以被接受,如下所示:是的,我过去使用过,我的应用通过了验证。除此之外,我看不出他们会试图阻止你的理由,这不是私有API,只是,有点笨拙,但如果你仔细想想,它也很强大。
//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);