Сбой tableView при добавлении первого элемента (а также при удалении последнего элемента) - PullRequest
0 голосов
/ 03 марта 2012

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

Завершение приложения из-за необработанного исключения «NSRangeException», причина: '- [__ NSArrayM objectAtIndex:]: индекс 0 вне границ для пустого массива '

Вот что я делаю: я добавляю контакт через php в свою базу данных, считываю его с xml и возвращаю его приложению, чтобы пользователь могмгновенно посмотреть, что произошло (добавив контакт, который есть).Здесь задействовано много кода, поэтому я пока придерживаюсь основ.Когда представление загружается, массив выделяется.Пользователь может добавить контакт.При добавлении контакта вызывается php-файл, который создает xml-файл, в котором сохраняются контакты.

Вот где я возвращаю объект, вставляю его в свой массив и отображаю его

self.filteredListContent = [NSMutableArray arrayWithCapacity:[self.tabelle count]];

self.tableView.scrollEnabled = YES;

numbers = [[NSMutableArray alloc] init];

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *fileName = [prefs stringForKey:@"number"];
NSString *cc = [prefs stringForKey:@"Code"];
NSString *urlString = [NSString stringWithFormat: @"http://myserver/%@%@.xml", cc, fileName];
NSURL *url = [NSURL URLWithString: urlString];

DataFileToObjectParser *myParser = [[DataFileToObjectParser alloc] parseXMLAtUrl:url toObject:@"contacts" parseError:nil];

for(int i = 0; i < [[myParser items] count]; i++) {
    contacts *new = [[Telefonbuch alloc] init];
    new = (contacts *) [[myParser items] objectAtIndex:i];
    [numbers addObject:new];
    [self.tableView reloadData];

И вот как он отображается, ничего особенного:

NSString *TableText = [[NSString alloc] initWithFormat:@"%@", [[numbers objectAtIndex:indexPath.row] fname]]; 
NSString *TableText2 = [[NSString alloc] initWithFormat:@"%@", [[numbers objectAtIndex:indexPath.row] lname]];    
NSString *cellValue = [NSString stringWithFormat:@"%@ %@", TableText, TableText2];
cell.textLabel.text = cellValue;

1 Ответ

1 голос
/ 03 марта 2012

Ваш цикл звучит странно.

for(int i = 0; i < [[myParser items] count]; i++) {
    contacts *new = [[Telefonbuch alloc] init];
    new = (contacts *) [[myParser items] objectAtIndex:i];
    [numbers addObject:new];
    [self.tableView reloadData];

Сначала избегайте использования ключевого слова new (как уже предлагал пользователь1118321).

Затем, что такое contacts?Является ли contacts суперклассом типа Telefonbuch?

Что означают эти две строки?

contacts *new = [[Telefonbuch alloc] init];
new = (contacts *) [[myParser items] objectAtIndex:i];

Вы выделяете-инициализируете экземпляр класса Telefonbuch для new(избегайте этого), но затем вы назначаете эту переменную другому объекту.Почему?

Правильный код может выглядеть следующим образом.

for(int i = 0; i < [[myParser items] count]; i++) {
   Telefonbuch* newContact = (Telefonbuch*) [[myParser items] objectAtIndex:i]; // or contacts* newContact = (contacts*) [[myParser items] objectAtIndex:i];
   // maybe it could be better to rename contacts with a capital letter
   [numbers addObject:newContact];
}

[self.tableView reloadData];

Некоторые примечания

Если вы хотите добавить или удалить элемент вПредставление таблицы, вам нужно сделать это в 2 этапа:

1) Разобраться с моделью

[yourModel removeObjectAtIndex:row];

2) Разобраться с анимацией вашего стола

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

Есливам нужно скачать контент, может быть, вы могли бы сделать это асинхронно, не блокируя основной поток.В частности, это может быть синхронный вызов, который может быть блокирующим (поскольку у меня нет подробностей, я только предполагаю это).

DataFileToObjectParser *myParser = [[DataFileToObjectParser alloc] parseXMLAtUrl:url toObject:@"contacts" parseError:nil];

Если вы не используете ARC, обратите внимание на управление памятью .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...