Objective-C доступ / изменение элементов массива в многомерном массиве (NSArray) - PullRequest
5 голосов
/ 18 января 2010

Я пытаюсь изменить значение в многомерном массиве, но получаю ошибку компилятора:

warning: passing argument 2 of 'setValue:forKey:' makes pointer from integer without a cast

Это мой массив контента:

NSArray *tableContent = [[NSArray alloc] initWithObjects:
                [[NSArray alloc] initWithObjects:@"a",@"b",@"c",nil],
                [[NSArray alloc] initWithObjects:@"d",@"e",@"f",nil],
                [[NSArray alloc] initWithObjects:@"g",@"h",@"i",nil],
                 nil];

Вот как я пытаюсь изменить значение:

[[tableContent objectAtIndex:0] setValue:@"new value" forKey:1];

Решение:

 [[tableContent objectAtIndex:0] setValue:@"new val" forKey:@"1"];

Таким образом, ключ массива является строковым типом - странно, но полезно знать.

Ответы [ 4 ]

11 голосов
/ 18 января 2010
NSMutableArray *tableContent = [[NSMutableArray alloc] initWithObjects:
                    [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil],
                    [NSMutableArray arrayWithObjects:@"d",@"e",@"f",nil],
                    [NSMutableArray arrayWithObjects:@"g",@"h",@"i",nil],
                     nil];

[[tableContent objectAtIndex:0] replaceObjectAtIndex:1 withObject:@"new object"];

Вы не хотите alloc+init для подмассивов, потому что счетчик хранения подмассивов будет слишком высоким (+1 для alloc, затем +1 снова, когда он вставляется во внешний массив массив).

2 голосов
/ 18 января 2010

Вы создаете неизменяемые массивы и пытаетесь изменить значения, хранящиеся в них.Вместо этого используйте NSMutableArray.

1 голос
/ 18 января 2010

Вы хотите либо NSMutableArray insertObject:atIndex:, либо replaceObjectAtIndex:withObject: (первый отодвинет существующий элемент обратно, если он уже существует, а второй заменит его, но не работает для индексов, которые еще не заняты). Сообщение setValue:forKey: принимает тип значения в качестве первого аргумента и строку NSString в качестве второго. Вы передаете целое число, а не строку NSString, которая никогда не действительна.

0 голосов
/ 28 февраля 2012

Извините, что отвечаю на вопрос полутора лет: D
Я получил ту же проблему, и, наконец, я решил ее с подсчетом элементов, а затем сделать addObject, чтобы нажать на элемент массива

...