1
-(CCNode *)createFieldNode:(NSMutableArray *)fieldArray{

    CGSize winSize = [CCDirector sharedDirector].viewSize;
    CCNode* stackNode= [CCNode node];

    for (int i; i <=fieldArray.count; i++){
        //itemP is previous item in array and itemC is current item in area based on index i 
        BPItem*itemP;
        BPItem*itemC;

        if(i!=0){
            itemP=[fieldArray objectAtIndex:i-1];
            itemC=[fieldArray objectAtIndex:i];
            float stackWidth=arc4random()%200+50; 
            float stackHeight=itemP.position.y+itemP.contentSize.height;
            itemC.position=ccp(stackWidth,stackHeight);
        }
        else{
            itemC=[fieldArray objectAtIndex:i];
            float stackWidth=arc4random()%200+50; 
            itemC.position=ccp(stackWidth,0);
        }

        //having trouble adding multiple nodes to stackNode
        [stackNode addChild:itemC];
    }

    return stackNode; 
}

CCNodes を fieldArray から親 CCNode "stackNode" に追加したいと考えています。ブレークポイントを使用すると、CCNode をインデックス 0 に追加し、CCNode をインデックス 1 に追加できます。ただし、プログラムは i=2 でクラッシュします。私が受け取るエラーは次のとおりです。

キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '子は既に別のノードに追加されています。再追加できません」

クラッシュする前に、「stackNode」には 2 つの子があります。CCNode を 1 つずつ追加していません。数百の異なる配列があり、多くの fieldArray.count が 20 前後です。不明な点がある場合は、詳しく説明してください。

4

1 に答える 1

1

for ループの開始を次のように変更します。

//itemP is previous item in array and itemC is current item in area based on index i 
BPItem*itemP;
BPItem*itemC;                             // moved out of the for loop
for (int i; i <fieldArray.count; i++){    // <- changed the end condition to avoid crash
   ... rest of loop

また、fieldArray を作成するコードでは、重複がないことを確認するロジックがあることを確認してください。そうしないと、同じ問題が発生します (ただし、まったく別の理由で)。

于 2014-10-05T11:02:56.213 に答える