4

我在头文件中有这些声明:
注意: 我不会解释整个代码,我认为它很容易理解

typedef void (^loopCell)(id cell);
-(id)allCells:(loopCell)cell;

以及allCells函数实现:

-(id)allCells:(loopCell)cell
{
    for (AAFormSection *section in listSections)
    {
        for (id _cell in section.fields) {
            cell(_cell);
        }
    }
    return nil;
}

allCells函数的用法:

-(void)setFieldValue:(NSString *)value withID:(int)rowID
{    
    [self allCells:^(id cell) {
        if([cell isKindOfClass:[AAFormField class]]) {
            AAFormField *_cell = (AAFormField *)cell;
            if(_cell.rowID == rowID) {
                _cell.value = value;
                //return; Here I want to terminate loop
            }
        }
    }];
}

我的问题是,我无法在中间终止allCells 循环(实际上当我在循环中找到我需要的对象时,我不想遍历其他对象)

如何在中间停止 allCells 循环?

4

2 回答 2

9

查看NSArray enumerateObjectsUsingBlock:. 他们设置块签名以获取 BOOL 指针。将 stop BOOL 设置为 YES 以导致迭代停止。

typedef void (^loopCell)(id cell, BOOL *stop);

-(id)allCells:(loopCell)cell {
    BOOL stop = NO;
    for (AAFormSection *section in listSections) {
        for (id _cell in section.fields) {
            cell(_cell, &stop);
            if (stop) {
                break;
            }
        }
        if (stop) {
            break;
        }
    }

    return nil;
}

-(void)setFieldValue:(NSString *)value withID:(int)rowID {    
    [self allCells:^(id cell, BOOL *stop) {
        if([cell isKindOfClass:[AAFormField class]]) {
            AAFormField *_cell = (AAFormField *)cell;
            if(_cell.rowID == rowID) {
                _cell.value = value;
                if (stop) {
                    *stop = YES;
                }
            }
        }
    }];
}
于 2012-10-31T05:07:25.643 回答
1

你不能脱离setFieldValue,但你可以脱离allCells

由您使用的调用块的方法(allCells在本例中)来提供停止循环的机制。通常,它是块的参数。

如果 allCells 是您的,并且您不介意修改它,则修改块签名以获取指向 BOOL 的指针,初始化为 YES,并检查块是否将其修改为 NO。

(注意:您可以break从 for in 循环中。)

于 2012-10-31T05:04:37.810 回答