2010-01-18 2 views
5

Я пытаюсь изменить значение в многомерном массиве, но получаю ошибку компиляции:Objective-C Доступ/изменение элементов массива в многомерный массив (NSArray)

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"]; 

Так ключ массив строкового типа - своего рода странно, но хорошо знать.

ответ

11
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 снова, как она вставляется в наружную массив).

+0

Спасибо за подсказку. – dan

2

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

+0

Это не в любом случае. Все равно получите ту же ошибку. – dan

1

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

+0

Нет сообщения типа setObject: atIndex: но setObject: forKey :. Но все равно получите ту же ошибку. – dan

+0

Нет 'setObject: atIndex:' для 'NSMutableArray', вместо этого существует' replaceObjectAtIndex: withObject: '. http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html – dreamlax

+0

Извиняется, вывешивается при выходе из двери и составляет метод. Я исправился, чтобы объяснить два метода, которыми я сталкивался в своей голове. – Chuck

0

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

Смежные вопросы