gpt4 book ai didi

ios - 具有 block 和停止参数的递归方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:55 24 4
gpt4 key购买 nike

我在 UIView 上编写了一个类别,它允许我遍历 View 层次结构:

UIView+Capture.h

typedef void(^MSViewInspectionBlock)(UIView *view, BOOL *stop);

@interface UIView (Capture)

- (void)inspectViewHeirarchy:(MSViewInspectionBlock)block;

@end

UIView+Capture.m

@implementation UIView (Capture)

- (void)inspectViewHeirarchy:(MSViewInspectionBlock)block
{
BOOL stop = NO;
[self inspectViewHeirarchy:block stop:stop];
}

#pragma - Private

- (void)inspectViewHeirarchy:(MSViewInspectionBlock)block stop:(BOOL)stop
{
if (!block || stop) {
return;
}
block(self, &stop);
for (UIView *view in self.subviews) {
[view inspectViewHeirarchy:block stop:stop];
if (stop) {
break;
}
}
}

@end

你可以这样使用:

[[[UIApplication sharedApplication] keyWindow] inspectViewHeirarchy:^(UIView *view, BOOL *stop) {
if ([view isMemberOfClass:[UIScrollView class]]) {
NSLog(@"Found scroll view!");
*stop = YES;
}
}];

一切正常,除了将 stop 设置为 YES。这似乎完全没有任何效果。理想情况下,我希望这样可以停止递归,这样当我找到要对其执行某些操作的 View 时,我不必继续遍历 View 层次结构的其余部分。

我对 block 的使用非常熟悉,所以它可能是完全显而易见的。任何帮助将不胜感激。

最佳答案

您使用 block 的方式与使用 C 函数的方式完全相同。所以关于 block ,您真的不需要了解什么特别的东西。您的代码应该可以工作,但请注意将 stop 作为 BOOL * 传递给您的 block 与在递归时创建新的本地代码之间的区别。

看起来您希望向下调用 inspectViewHierarchy:stop: 以影响外部 stop 变量。除非您将其作为引用传递,否则不会发生这种情况。所以我想你想要的是:

- (void)inspectViewHeirarchy:(MSViewInspectionBlock)block stop:(BOOL *)stop

...以及适当的其他更改。

关于ios - 具有 block 和停止参数的递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22463017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com