我正在尝试在某些数据加载期间更改单元格中的访问者:当用户选择单元格时,我从JSON服务加载数据,并且在此加载期间我想显示一个微调器作为访问者。加载后,下一个视图控制器显示所需内容。我使用这段代码但是访问器没有改变(即使我在从方法返回之前在线程中等待):
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UIActivityIndicatorView *activityView =
[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[activityView startAnimating];
UIView *oldAccessorView = [cell accessoryView];
[cell setAccessoryView:activityView];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject: indexPath] withRowAnimation:UITableViewRowAnimationFade];
MembersViewController *membersViewController = [[MembersViewController alloc] init];
membersViewController.title = @"Members";
// load the members, must be done in a separate thread and must change the cell accessor type to a spinner...
JSONLoader *loader = [[JSONLoader alloc] init];
NSString *membersURL = [NSString stringWithFormat:@"%@/members/all.json", jug.apiURL];
NSMutableArray *members = [loader getMembersFromURL:membersURL];
membersViewController.members = members;
[loader release];
[members release];
[self.navigationController pushViewController:membersViewController animated:YES];
[membersViewController release];
// restore old accessor view
[NSThread sleepForTimeInterval:5];
[activityView stopAnimating];
[activityView release];
[cell setAccessoryView:oldAccessorView];
答案 0 :(得分:0)
不是100%肯定我对这个问题很清楚。但以下内容可能有所帮助:
1)从此代码中不清楚您是否给iOS提供了更新显示的机会。它只在运行循环结束时才这样做。但是从我可以看出,所有代码都在与run循环相同的传递中运行。如果诊断正确,则需要明智地使用[self performSelector: @selector(method:) withObject: nil afterDelay: 0.0]
。
This question可能是有用的背景。 The answer针对不同的问题说明了如何部署performSelector:withObject:afterDelay:technique。
2)除非我遗漏了某些内容,否则您需要在[oldAccessoryView retain]
来电之前添加[cell setAccessoryView: activityView]
。然后在随后的`[cell setAccessoryView:oldAccessoryView]'之后再次释放它。但也许你在其他地方保留配件视图。
答案 1 :(得分:0)
我同意马修的第1点: 更新ui IS在循环结束时进行,因此您必须异步执行REST调用。 对于第2点: 根据附件视图中的内容,您可能不需要保存它。