我有一个rss解析器作为我的应用程序代码的一部分,它工作正常并加载rss xml文件并填充tableview正常。
问题在于刷新/重新加载按钮,它会重新加载rss数据,但是它会将新数据附加到表中,并且表的大小会不断增长。
应该做的是清除旧表数据并使用新数据重建表 - 这样表总是只显示一组数据,并且每次按下重新加载/刷新时都不会继续增长。
表构建代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];
cell.detailTextLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
[cell.textLabel setLineBreakMode:UILineBreakModeWordWrap];
[cell.textLabel setNumberOfLines:0];
[cell.textLabel sizeToFit];
[cell.detailTextLabel setLineBreakMode:UILineBreakModeWordWrap];
[cell.detailTextLabel setNumberOfLines:0];
[cell.detailTextLabel sizeToFit];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
重新加载/刷新按钮代码为:
- (void)reloadRss {
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[[self navigationItem] setLeftBarButtonItem:barButton];
[barButton release];
[activityIndicator release];
[activityIndicator startAnimating];
[self performSelector:@selector(parseXMLFileAtURL) withObject:nil afterDelay:0];
[newsTable reloadData];
}
我试图通过添加以下行来解决这个问题:
if (stories) { [stories removeAllObjects]; }
到重新加载部分,我认为应该可以工作并清除表格,但应用程序然后使用EXC_BAD_ACCESS崩溃应用程序。
非常感谢任何想法或建议!
答案 0 :(得分:1)
实际上,现在已经解决了这个问题!
由于数组的“自动释放”元素,所以在清除之后,它们无效。
删除autorelease
并在最终的dealloc中释放这些对象。
答案 1 :(得分:0)
代码 EXC_BAD_ACCESS 的意思是,您希望连接不再存在的变量。
在您的代码示例中,我可以看到,问题在于以下两行代码:
[activityIndicator release];
[activityIndicator startAnimating];
您可以在启动动画时释放activityIdicator。
尝试在功能结束时发布。
[activityIndicator startAnimating];
[self performSelector:@selector(parseXMLFileAtURL) withObject:nil afterDelay:0];
[newsTable reloadData];
[activityIndicator release];