Подтвердить что ты не робот

UIRefreshControl перестает вращаться после того, как приложение неактивно

Я использую UIRefreshControl в UITableView:

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

С обработчиком refresh:

-(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];
        });
    });
}

Во время продолжительной работы я делаю приложение неактивным нажатием кнопки "Домой". После этого я снова активирую приложение. Вращающийся элемент замерзает (перестает вращаться), и нет способа вернуть его в исходное состояние.

Как это исправить?

4b9b3361

Ответ 1

Я думаю, что это немного отложенный ответ, но сегодня я видел подобную проблему на ios 7, ios 6 продолжал вращаться,

здесь немного обходного пути для этого

- (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;
    }
}

он остановится и начнет снова вращаться, но это произошло только на ios7 со мной, так что, возможно, вы должны проверить, не делать это на 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;
    }
}

Ответ 2

Это то, что сработало для меня

Swift 3 и Swift 4:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if self.refreshControl?.isRefreshing == true {
        let offset = self.tableView.contentOffset

        self.refreshControl?.endRefreshing()
        self.refreshControl?.beginRefreshing()
        self.tableView.contentOffset = offset
    }
}

Swift 2.3:

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if self.refreshControl?.refreshing == true {
        let offset = self.tableView.contentOffset

        self.refreshControl?.endRefreshing()
        self.refreshControl?.beginRefreshing()
        self.tableView.contentOffset = offset
    }
}

Ответ 3

Это все еще проблема в iOS11. Решение нужно немного изменить, хотя в противном случае управление обновлением будет слишком быстрым.

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

        // Delay the restart
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self.refreshControl beginRefreshing];
            self.tableView.contentOffset = offset;
        });
    }
}