0

NSMutableArray から文字列 valur を選択し、plist に保存する必要があります。テーブル ビューに情報を表示する NSMutableArray を作成しました。最大許容インデックスは 8 です (例では 2 つだけ貼り付けます)。

String が存在しない場合の問題です。次のエラーが発生します。sDict は、データをプロパティ リスト ファイルに保存するための辞書です。

コード:

- (IBAction)save:(id)sender {
(...)
NSString *One;
NSString *Two;
...etc

if ([self.smOne objectAtIndex:0])
One = [self.smOne objectAtIndex:0];
if ([self.smOne objectAtIndex:1])
Two = [self.smOne objectAtIndex:1];
...etc

if (One)
[sDict setObject:[self.smTwo objectAtIndex:0] 
                forKey:[UserM stringByAppendingString:One]];
[sDict setObject:[self.smThree objectAtIndex:0] 
                forKey:[UserS stringByAppendingString:One]];
[sDict setObject:[self.smFour objectAtIndex:0] 
                forKey:[UserP stringByAppendingString:One]];


if (Two)
[sDict setObject:[self.smTwo objectAtIndex:1] 
                 forKey:[UserM stringByAppendingString:Two]];
[sDict setObject:[self.smThree objectAtIndex:1] 
                 forKey:[UserS stringByAppendingString:Two]];
[sDict setObject:[self.smFour objectAtIndex:1] 
                 forKey:[UserParM stringByAppendingString:Two]];


 ...etc
 }

このコードは、すべてのオブジェクトが存在する場合に機能しますが、インデックスにあるオブジェクトの 1 つが見つからない場合は失敗します。オブジェクトが存在するかどうかを正しく確認する方法が本当にわかりません。上記のコードがうまく機能しないようです。

[self.smOne count] で試してみましたが、条件を作成するために Int または String として渡すのが問題でした。ご回答ありがとうございます。

4

3 に答える 3

2

インデックス 1 から 8 までの smOne を明示的にチェックしているように見えます。しかし、配列は最大 8 まで持つことができるとも述べました。したがって、たとえば 6、7、8 が欠落している場合でも、 を呼び出していることになります[smOne objectAtIndex:6]。 6 は配列の範囲外であるため、NSRangeException が発生します。

代わりにこれを試してください:

int i = 0;

for ( NSString *aString in self.smOne )
{

 [sDict setObject:[self.smTwo objectAtIndex:i] 
           forKey:[UserM stringByAppendingSting:aString]];
 [sDict setObject:[self.smThree objectAtIndex:i] 
           forKey:[UserS stringByAppendingString:aString]];
 [sDict setObject:[self.smFour objectAtIndex:i] 
           forKey:[UserP stringByAppendingString:aString]];

 i++;

}

smOne 配列内の各オブジェクトを調べて、smOne 内の項目数に関係なく、オブジェクトを sDict に追加します。

また、キーの生成方法にも注意してください。[UserM stringByAppendingSting:aString] が常に一意であるとは限らない可能性があります。

于 2009-10-14T16:57:04.210 に答える
0

さて、ついに動作します。ドキュメントへのリンクをありがとう、前回読みすぎました。これは最もクリーンな方法ではないと確信していますが、次のループで機能します。

for (key in sDict) {
    if ([sDict valueForKey:[UserMen stringByAppendingFormat:@"%d",i]]) {
      tempMe = [sDict valueForKey:[UserMen stringByAppendingFormat:@"%d",i]];
        if (tempMe) {
        [manArray insertObject:tempMe atIndex:(0 + a)];
        [bankArray insertObject:[NSString stringWithFormat:@"%d",i] atIndex:(0 + a)];
        a++;
        }
    }
    if ([sDict valueForKey:[UserSerial stringByAppendingFormat:@"%d",i]]) {
        SMSer = [sDict valueForKey:[UserSerial stringByAppendingFormat:@"%d",i]];
        if (SMSer) {
        [serArray insertObject:SMSer atIndex:(0 + b)];
        b++;
            }
    }
    if ([sDict valueForKey:[UserPart stringByAppendingFormat:@"%d",i]]) {
        SMPart = [sDict valueForKey:[UserPart stringByAppendingFormat:@"%d",i]];
        if (SMPart) {
        [partArray insertObject:SMPart atIndex:(0 + c)];
        c++;
       }
    }
    i++;
}
于 2009-10-15T11:47:14.367 に答える
0

もう一度質問して申し訳ありませんが、ループで保存されたキー/文字列のペアから配列を再構築する方法を見つけるのが困難です。

私はこれを試しました:

int i = 0;
for (NSString *SMServ in [temp objectForKey:
                         [UserMen stringByAppendingFormat:@"%d",i]]){
    NSString *SMMem[i];
    SMMem[i] = [temp objectForKey:[UserMen stringByAppendingFormat:@"%d",i]];
    NSArray *theArray = [ NSArray arrayWithObjects:SMMem count:i];
    i++;    
    }

しかし、何も起こりません。[i] の代わりに for (i = 0; i < 9; i ++) と (i + 1) を試してみると、最初の例と同じ境界エラーが発生します。

助けてくれてありがとう。

于 2009-10-14T20:39:40.233 に答える