проблемы с массивом replaceObjectAtIndex - PullRequest
1 голос
/ 22 декабря 2009

Я уже некоторое время ищу ответ на этот вопрос, и я думаю, что из-за характера моего массива я могу искать неправильный ответ!

У меня есть класс, который обрабатывает добавление элементов в мой массив:

// Item.h
@interface Item : NSObject {
    NSString *name;
    NSNumber *seconds;
}

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSNumber *seconds;

- (id)initWithName:(NSString *)n seconds:(NSNumber *)sec;

@end

и ...

//item.m

@implementation Item
@synthesize name, seconds;


- (id)initWithName:(NSString *)n seconds:(NSNumber *)sec {
    self.name = n;
    self.seconds = sec;
    return self;
}
@end

Итак, чтобы добавить предмет, я использую

Item *item1 = [[Item alloc] initWithName:@"runnerA" seconds:[NSNumber numberWithInt:780]];

У меня есть некоторый код, который позволяет пользователю редактировать текстовое поле (имя бегуна) и время, которое является UIdatepicker, установленным на часы и минуты. В методе сохранения это работает нормально. Это ОБНОВЛЕНИЕ, что я не могу приступить к работе. Я пробовал разные! Вот код на данный момент ...

mainAppDelegate *appDelegate = (mainAppDelegate *)[[UIApplication sharedApplication] delegate];    
Item *item = [[Item alloc] initWithName:inputName.text seconds:[NSNumber numberWithInt:secs]];
[appDelegate.arrItems replaceObjectAtIndex:rowBeingEdited withObject:item];

Выше просто добавление нового элемента в массив (что я не хочу). Я не уверен, как заменить значения. В функции у меня есть строка, которую нужно обновить (rowBeingEdited), и поля inputName.text и secs оба в порядке. (NSLog out подтверждает это).

Как использовать replaceObjectAtIndex, чтобы фактически заменить его значениями ?! Это сводит меня с ума сейчас !!

Ответы [ 2 ]

2 голосов
/ 22 декабря 2009

Поскольку вы просто пытаетесь редактировать определенную строку, почему бы не использовать те средства доступа к свойствам, которые вы уже настроили в Item? Это будет выглядеть примерно так:

Item *item = (Item *)[appDelegate.arrItems objectAtIndex:rowBeingEdited];
[item setName:inputName.text];
[item setSeconds:[NSNumber numberWithInt:secs]];

Примечание: вы используете сборщик мусора или вручную освобождаете Item объекты, которые вы создаете при добавлении элементов в массив? Если вы делаете это вручную, это должно выглядеть так:

Item *item1 = [[Item alloc] initWithName:@"runnerA"
                                 seconds:[NSNumber numberWithInt:780]];
[appDelegate.arrItems addObject:item1];
[item1 release];

Это следует эмпирическому правилу: если вы alloc, copy или retain что-либо, вы также должны release это. Обратите внимание, что это работает, потому что массив будет сохранять элемент при добавлении.

1 голос
/ 22 декабря 2009
  1. Вы используете NSArray или NSMutableArray?
  2. Если вы используете NSMutableArray, как вы инициализировали и заполнили массив в первую очередь?

Например, недостаточно использовать -initWithCapacity: или +arrayWithCapacity:, который только выделяет пробел. Вы должны использовать -addObject: для первого раунда населения, прежде чем вы сможете использовать -replaceObjectAtIndex:withObject::

Обратите внимание, что объекты NSArray не похожи на массивы C . То есть, даже если вы указываете размер при создании массива, указанный размер рассматривается как «подсказка»; фактический размер массива по-прежнему равен 0. Это означает, что вы не можете вставить объект с индексом, превышающим текущий счетчик массива. Например, если массив содержит два объекта, его размер равен 2, поэтому вы можете добавлять объекты с индексами 0, 1 или 2. Индекс 3 недопустим и выходит за пределы; если вы пытаетесь добавить объект с индексом 3 (когда размер массива равен 2), NSMutableArray вызывает исключение.

...