ioscocoa-touchuitableviewuirefreshcontrol

UIRefreshControl stops spinning after making application inactive


I use UIRefreshControl in a UITableView:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh)
         forControlEvents:UIControlEventValueChanged]; 
self.refreshControl = refreshControl;

With refresh handler:

-(void)refresh {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // (...some long running operation...)
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.refreshControl endRefreshing];
        });
    });
}

During the long running operation I make the application inactive pressing Home button. After that I make the application active again. The spinner freezes (stops spinning) and there is no way to return it to the initial state.

How to fix it?


Solution

  • I think it is a bit delayed answer but , today I saw similar issue on ios 7 , ios 6 continued spinning ,

    here is a little workaround for this

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        if(self.refreshControl.isRefreshing) {
            CGPoint offset = self.tableView.contentOffset;
            [self.refreshControl endRefreshing];
            [self.refreshControl beginRefreshing];
            self.tableView.contentOffset = offset;
        }
    }
    

    it will stop and start again spinning , but it only happened on ios7 with me , so maybe you should check not to do it on ios6

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        if(self.refreshControl.isRefreshing && [[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGPoint offset = self.tableView.contentOffset;
            [self.refreshControl endRefreshing];
            [self.refreshControl beginRefreshing];
            self.tableView.contentOffset = offset;
        }
    }