添加第一个项目时(删除最后一个项目时)tableView崩溃

时间:2012-03-03 14:29:14

标签: ios tableview

清理完代码并准备好部署之后,我遇到了一个奇怪的问题。当我尝试将联系人添加到我的tableview时,它总是在空数组时崩溃。之后,添加任意数量的问题都没有问题。而且当我删除一个联系人并且该数组为空时,它也会崩溃,并显示相同的错误消息:

  

由于未捕获的异常'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 个答案:

答案 0 :(得分:1)

你的循环听起来很奇怪。

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是什么? contactsTelefonbuch类型的超类吗?

这两行是什么意思?

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

您将Telefonbuch类的实例alloc-init添加到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];

一些注释

如果要在表格视图中添加或删除项目,则需要分两个阶段进行:

1)处理你的模特

[yourModel removeObjectAtIndex:row];

2)处理你的桌子动画

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

如果您需要下载内容,也许您可​​以考虑在不阻止主线程的情况下进行异步操作。特别是,这可能是同步调用,可能是阻塞调用(因为我没有任何细节,我只是假设它)。

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

如果您不使用ARC,请注意内存管理

希望它有所帮助。