2017-12-02 21 views
-2

基本的に重量を把握しているアプリを構築しています。より良い視覚的なアプローチのために、私は、スクリーンショットを添付:NSUserDefaultsで「境界3を超えるインデックス3」の問題

enter image description here

スクリーンショットの短い説明:私は黒でマークされたとして、インデックス0,1,2,3(に重みを格納NSMutableArrayのを宣言しました色)。 「初期」バーはこのMutableArrayとは関係ありません。ウェイトが追加されるたびに、後で使用するためにNSUserDefaultsに保存されます。

MutableArrayのすべてのアイテムが塗りつぶされている、つまりすべてのバーが表示されているときに、インデックス0が削除されるように別のウェイトを追加したい場合、インデックス1と2は " 1位で「左に移動し、その後、インデックス3

で新しい重みを追加私の問題は次のとおりです。すべてのバーが満たされた後、新たな重量を追加する時に、私はこのエラーを取得する:

[__NSArrayM objectAtIndexedSubscript:]: index 3 beyond bounds [0 .. 2]

このエラーは、配列が空であることを意味しています。私はその理由を理解できません。

これはチャートがロードされているNSMutableArrayのを初期化するコードです:

if([weightUserDefaults objectForKey:@"weightMutableArray"] == nil){ // If no weight has ever been inserted then initialize array. 

    // We initialize the array, otherwise it crashes. 
    [weightMutableArray addObject:@"0"]; 
    [weightMutableArray addObject:@"0"]; 
    [weightMutableArray addObject:@"0"]; 
    [weightMutableArray addObject:@"0"]; 

    // We store this 1st time array initialization in the UserDefaults 
    [weightUserDefaults setValue:weightMutableArray forKey:@"weightMutableArray"]; 

    }else{ // If we have a weight from the Inaction, then show it in the graph 

    weightMutableArray = [[weightUserDefaults objectForKey:@"weightMutableArray"] mutableCopy];; 

    NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 

    PNBarChart * barChart = [[PNBarChart alloc] initWithFrame:CGRectMake(0, 0, optionsUIView.bounds.size.width, optionsUIView.bounds.size.height)]; 

     [barChart setYValues:@[ 
     [f numberFromString:[weightUserDefaults objectForKey:@"InitialWeight"]], 
     [f numberFromString:[weightMutableArray objectAtIndex:0]], 
     [f numberFromString:[weightMutableArray objectAtIndex:1]], 
     [f numberFromString:[weightMutableArray objectAtIndex:2]], 
     [f numberFromString:[weightMutableArray objectAtIndex:3]]]]; 

     [barChart strokeChart]; 
     [optionsUIView addSubview:barChart]; 
     [optionsUIView addSubview:addweightButton]; 

そして、これが新たな重量を追加するIBActionです。私が調査した限りでは、ここに問題があると確信しています。

for (int i=0;i < [weightMutableArray count]; i++){ // We start iterating in the array 
    if(![weightMutableArray[3] isEqualToString:@"0"]){ // If index 3 is not 0, means its been filled 
    [weightMutableArray removeObjectAtIndex:0]; // Then we remove the index 0 

    for (int j = 1;j<=3;j++)[weightMutableArray replaceObjectAtIndex:j-1 withObject:weightMutableArray[j]]; 
    [weightMutableArray insertObject:[[alertController textFields][0] text] atIndex:3]; // whatever its in index 1, put it in index 0. Then whatever its in index 2, put it in index 1, etc etc. 

      break; 
    }else if([weightMutableArray[i] isEqualToString:@"0"]){ //if any index is 0. 

    [weightMutableArray replaceObjectAtIndex:i withObject:[[alertController textFields][0] text]]; // then fill data from the UITextfield. 

      break; 
     } 
    } 

    // After everything is done, just store it back in the UserDefaults. 
    [weightUserDefaults setValue:weightMutableArray forKey:@"weightMutableArray"]; 
+0

なぜループに '3'を入れるのか分かりません。 '私'を意味しましたか? – trungduc

+0

あなたは 'j'の意味ですか?私はweightMutableArrayのインデックス1,2,3でiterareを使いたいと思っています。考え方は次のとおりです:weightMutableArray [j-1] = index1,2,3のweightMutableArray [j]。 – pedrogr90

+0

私は 'if(![weightMutableArray [3] isEqualToString:@" 0 "])'を意味しません。 「3」は「i」を意味する。右? – trungduc

答えて

0

あなたが最初の最初のアイテム削除する場合:

[weightMutableArray removeObjectAtIndex:0]; // Then we remove the index 0 

配列はインデックス0-2の値3とのままに。 (ココア)アレイは、常に最初の項目は、次の要素をプルアップ除去、(コンパクト)が閉鎖されているので

0: value1 
1: value2 
2: value3 
3: value4 

:アレイは次のようになり除去前

0: value2 
1: value3 
2: value4 

したがって、インデックス3と項目がない:

for (int j = 1;j<=3;j++) 

あなたは単純に残りのアイテムを移動する必要はありませんが、今のアレイは、このようになります。すでに完了しています。

しかし、私はこれをすべての点で言えば、変更可能なコレクションとゼロ化という概念全体を誤解しています。これは、ゼロの特別なバージョンであり、ヌルの反パターンです。

+0

を見てください。これは、私が "コンセプトを誤解した"という意味です。 –

+0

はい、私はそのコンセプトを誤解しています。私はちょうど私がコード化した 'for j'はココアが私のためにやっていることを知らない、あるいは考慮しなかったので、同じことを2回やっていました。ありがとうございました:) – pedrogr90

+0

コードの問題は、(配列の作成時に)最初から、ゼロを使用して「空の」存在しない要素を表すことです。 –

関連する問題