1

オブジェクトとキーを含む NSDictionary があります。キーは名前と番号を保持します。insertObject: atIndex: を使用して、これらのオブジェクトを NSMutableArray に挿入したいと思います。オブジェクトは名前で、番号はオブジェクトを配置したいインデックスです。1-5 がない場合、NSMutableArrays は index:6 にオブジェクトを挿入できることがわかりました。これを可能にするにはどうすればよいですか? どんな提案でも大歓迎です!

辞書の例 [dict objectForKey:@"array"]:

 preferences as whole (
        {
        Name = PowerDown;
        btnIndex = 3;
    },
        {
        Name = ClearCache;
        btnIndex = 5;
    },
        {
        Name = KillBGApps;
        btnIndex = 6;
    },
        {
        Name = InfoPanel;
        btnIndex = 2;
    },
        {
        Name = Lock;
        btnIndex = 4;
    },
        {
        Name = Reboot;
        btnIndex = 0;
    },
        {
        Name = Respring;
        btnIndex = 1;
    }
)

これまでに持っているものですが、配列の範囲外にオブジェクトを追加するとクラッシュします

-(void)loadArray{

 self.buttons = [NSMutableArray array];


    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    tempArray = [buttonsPrefs objectForKey:@"buttonsToOrder"];


    for(NSDictionary * dict in tempArray)
    {
        if (dict) {

            NSString *btnName = [dict objectForKey:@"Name"];

            NSString *btnIndex = [dict objectForKey:@"btnIndex"];
            NSUInteger index = [btnIndex integerValue];

            NSLog(@"Name = %@",btnName);
            NSLog(@"at index %i",index);

            [self.buttons insertObject: btnName atIndex: index];
        }


    }

}

編集:これらの値は、ユーザーがセルを移動したときに変更される名前の「インデックス」です

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath 
*)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
NSUInteger fromIndex = [fromIndexPath row];
NSUInteger toIndex = [toIndexPath row];
if (fromIndex == toIndex)
    return;
NSMutableDictionary *selectedButton = [[[_buttons objectAtIndex:fromIndex] retain] 
autorelease];
[_buttons removeObjectAtIndex:fromIndex];
[_buttons insertObject:selectedButton atIndex:toIndex];


//[buttonsPrefs setObject:_buttons forKey:@"buttonsToOrder"];
//[buttonsPrefs writeToFile:[self getFilePath] atomically: YES];


}
4

2 に答える 2

2

次のように、 yourDict カウントに従って、ターゲット配列にダミーデータを入力してみてください。

for (int i=0, i<[yourDict count], ++i){
    [yourArray addObject:@"dummyData"];
}

そして、insertObject が必要な場合は、次のようにします。

for(NSDictionary * dict in tempArray)
{
    if (dict) {

        NSString *btnName = [dict objectForKey:@"Name"];

        NSString *btnIndex = [dict objectForKey:@"btnIndex"];
        NSUInteger index = [btnIndex integerValue];

        [yourArray insertObject:btnName atIndex:index];
        [yourArray removeObjectAtIndex:index+1];
    }
}
于 2012-10-02T04:13:41.640 に答える
0
NSMutableArray insertObject: atIndex:

アップルのドキュメントに従って `

「NSArray オブジェクトは C 配列とは異なることに注意してください。つまり、配列を作成するときにサイズを指定しても、指定したサイズは「ヒント」と見なされます。配列の実際のサイズは 0 のままです。つまり、配列の現在の数よりも大きいインデックスにオブジェクトを挿入することはできません。」

有効な配列値セット内にのみ入力できます。できることは 2 つあります。

  1. 配列をソートして埋める
  2. 配列に文字列などのデフォルト オブジェクトを入力し (nil にすることはできません)、それを置き換えます。このオプションは、配列にすべての値を入力する場合に有効です。値はその位置にあります
于 2012-10-02T04:14:10.597 に答える