Вопрос

Я новичок в 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 ++;
}

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

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

Это было полезно?

Решение

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

[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. Но вы должны сначала исправить ошибку, так как изменение этой второй части просто скроет ошибку и сделает еще более загадочным, что новая конфигурация просто заменяет старую.

Другие советы

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

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

и все тут.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top