【问题标题】:Change accessor view on row selection更改行选择的访问器视图
【发布时间】:2011-09-10 10:04:47
【问题描述】:

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

【问题讨论】:

    标签: ios uitableview


    【解决方案1】:

    不是 100% 确定我清楚这个问题。但以下可能会有所帮助:

    1) 从这段代码中不清楚您是否让 iOS 有机会更新显示。它仅在运行循环结束时执行此操作。但是据我所知,您的所有代码都在与运行循环相同的通道中运行。如果该诊断是正确的,则需要明智地使用[self performSelector: @selector(method:) withObject: nil afterDelay: 0.0]

    This question 可能是有用的背景。 The answer 到不同的问题说明了如何部署 performSelector:withObject:afterDelay: 技术。

    2) 除非我遗漏了什么,否则您需要在 [cell setAccessoryView: activityView] 调用之前添加 [oldAccessoryView retain]。然后在后续的`[cell setAccessoryView:oldAccessoryView]'之后再次释放。但也许您在其他地方保留了附件视图。

    【讨论】:

    • 好的,谢谢你的回答,我不清楚 iOS 在运行循环后更新显示。我会根据您的建议尝试更改我的代码。
    【解决方案2】:

    我同意马修的第 1 点: ui 更新是在循环结束时进行的,因此您必须异步进行 REST 调用。 对于第 2 点: 鉴于附件视图中的内容,您可能不需要保存它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多