基本的に重量を把握しているアプリを構築しています。より良い視覚的なアプローチのために、私は、スクリーンショットを添付:NSUserDefaultsで「境界3を超えるインデックス3」の問題
スクリーンショットの短い説明:私は黒でマークされたとして、インデックス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"];
なぜループに '3'を入れるのか分かりません。 '私'を意味しましたか? – trungduc
あなたは 'j'の意味ですか?私はweightMutableArrayのインデックス1,2,3でiterareを使いたいと思っています。考え方は次のとおりです:weightMutableArray [j-1] = index1,2,3のweightMutableArray [j]。 – pedrogr90
私は 'if(![weightMutableArray [3] isEqualToString:@" 0 "])'を意味しません。 「3」は「i」を意味する。右? – trungduc