Добавление строки в таблицу в Objective-C - PullRequest
0 голосов
/ 18 сентября 2009

Я новичок в Objective-C, и у меня много проблем с попыткой добавить новые строки в таблицу. Предполагается, что он работает, когда приложение загружает всплывающее предупреждение, спрашивающее пользователя, хотят ли они, запустить новую конфигурацию, загрузить сохраненную конфигурацию или возобновить последнюю конфигурацию. Теперь, если они выберут запуск новой конфигурации, им будет предложено ввести новое имя, и когда они нажмут «Готово», приложение сохранит новую конфигурацию в таблице.

Прямо сейчас я могу заставить приложение хранить только одну конфигурацию в таблице, но если пользователь пытается создать другую новую конфигурацию, приложение вылетает. Вот как выглядит мой код:

- (IBAction) testToAddToList
{
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name

    NSMutableArray *array = [[NSMutableArray alloc] init];

    [array insertObject:nameOfConfig atIndex:configListDataIndex];

    self.configListData = array;

    [array release];

    configListDataIndex ++;
}

Я много читал об этом, но, похоже, это не должно быть слишком сложно. Также мне кажется, что основная проблема в том, что у «массива» есть только один индекс, и когда пользователь пытается добавить другой, это приводит к падению приложения.

Может ли кто-нибудь помочь мне и сказать, что я делаю неправильно и как я могу сделать это правильно? Пожалуйста! ... А может, просто укажете мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2009

Проблема, как упоминает Вуфи, состоит в том, что вы создаете новый массив каждый раз вместо того, чтобы захватывать ранее созданный массив. Итак, при первом добавлении в массив вы в основном делаете:

[array insertObject:nameOfConfig AtIndex:0];

но в следующий раз вы создаете новый (пустой) массив, и переменная configListDataIndex теперь равна 1, поэтому вы вызываете

[array insertObject:nameOfConfig atIndex:1];

и сбой, потому что 1 выходит за границы для пустого массива. Чтобы решить эту проблему, вы можете сделать что-то вроде:

NSMutableArray *array;
if (self.configListData != nil)  // I know, unnecessary, but I like being explicit with my nil checks.
    array = self.configListData;
else
    array = [NSMutableArray array];

Тогда не выпускайте его в конце функции (поскольку я предполагаю, что ваш получатель для configListData автоматически освобожден или назначен).

Это исправит сбой. Кроме того, вы всегда можете просто позвонить

[array addObject:nameOfConfig];

, который автоматически добавляет объект в конец массива, так что вы можете избавиться от переменной index. Но вы должны сначала исправить сбой, так как изменение этой второй части просто скроет ошибку и сделает еще более загадочным то, что новый конфиг просто заменит старый.

2 голосов
/ 19 сентября 2009

Не будет ли намного проще использовать -addObject: метод NSMutableArray вместо insertObject? зачем использовать дополнительную переменную (configListDataIndex), когда вы можете просто использовать addObject: nameOfConfig:

[array addObject:nameOfConfig];
self.configListData = array;
[array release];

и все.

И я думаю, что знаю, почему он падает ... вы всегда создаете новый объект массива и каждый раз вставляете «nameOfConfig» в другое место в всегда новом пустом массиве. И поэтому в configListData всегда будет только один объект. Не лучше ли редактировать configListData напрямую?

...