清理完代码并准备好部署之后,我遇到了一个奇怪的问题。当我尝试将联系人添加到我的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;
答案 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
是什么? contacts
是Telefonbuch
类型的超类吗?
这两行是什么意思?
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,请注意内存管理。
希望它有所帮助。