开发者

Change accessor view on row selection

开发者 https://www.devze.com 2023-04-04 10:54 出处:网络
I am trying to change the accessor in a cell during some data loading : when the user selects the cell, I load data from a JSON service, and during this load I want to display a spinner as accessor. W

I am trying to change the accessor in a cell during some data loading : when the user selects the cell, I load data from a JSON service, and during this load I want to display a spinner as accessor. When loaded, the next view controller display what needed. I use this code but the accessor is not changed (even if I wait in the thread before returning from the method):

 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 = [[MembersViewC开发者_如何转开发ontroller 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];


Not 100% sure I'm clear on the question. But the following might help:

1) It's not clear from this code that you are giving iOS the opportunity to update the display. It only does that at the end of the run loop. But from what I can make out all your code is running in the same pass as the run loop. If that diagnosis is right, then some judicious use of [self performSelector: @selector(method:) withObject: nil afterDelay: 0.0] will be needed.

This question might be helpful background. The answer to a different questions illustrates how to deploy the performSelector:withObject:afterDelay: technique.

2) Unless I'm missing something, you need to add [oldAccessoryView retain] before your [cell setAccessoryView: activityView] call. Then release it again after the subsequent `[cell setAccessoryView:oldAccessoryView]'. But maybe you are retaining the accessory view elsewhere.


i agree with Matthew on point 1: update on ui IS made at the end of the loop, so you have to do your REST call asynchronously. For point 2: given on what was in the accessory view, you may not need to save it.

0

精彩评论

暂无评论...
验证码 换一张
取 消