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 に変更したかどうかを確認します。

(注: breakfor in ループから実行できます。)

于 2012-10-31T05:04:37.810 に答える