更改行选择的访问者视图

时间:2011-09-10 10:04:48

标签: ios uitableview

我正在尝试在某些数据加载期间更改单元格中的访问者:当用户选择单元格时,我从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];

2 个答案:

答案 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点: 根据附件视图中的内容,您可能不需要保存它。