UIRfreshControl не показывает колючку при вызове beginRefreshing, а contentOffset равен 0

Я не вижу индикатор загрузки при вызове beginRefreshing

[self.refreshControl beginRefreshing];

Мой подкласс UITableViewController использует UIRefreshControl

// refresh
    UIRefreshControl * refreshControl = [UIRefreshControl new];
    [refreshControl addTarget:self action:@selector(refreshTableView) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;

Он отлично работает с взаимодействием с пользователем (когда пользователь опускает стол), тогда счетчик виден.

Но когда я вызываю beginRefreshing для viewDidLoad, я не вижу счетчик (только когда я перетаскиваю таблицу вниз).

Примечания:

  • Ссылка на self.refreshControl верна

  • reloadData или endRefreshing вызываются не сразу после beginRefreshing, а с большой задержкой (загрузка данных по сети), поэтому я не отменяю beginRefreshing.

Редактировать: Это происходит только тогда, когда свойство contentOffset tableView равно 0, и я вызываю [self.refreshControl beginRefreshing]. Ошибка? Особенность?


person Peter Lapisu    schedule 20.04.2013    source источник
comment
Где повторяющийся вопрос?   -  person shontauro    schedule 19.02.2016


Ответы (2)


Для меня это выглядит как ошибка, потому что это происходит только тогда, когда свойство contentOffset tableView равно 0

Я исправил это с помощью следующего кода (метод для UITableViewController):

- (void)beginRefreshingTableView {

    [self.refreshControl beginRefreshing];

    if (self.tableView.contentOffset.y == 0) {

        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){

            self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);

        } completion:^(BOOL finished){

        }];

    }
}
person Peter Lapisu    schedule 27.04.2013
comment
Это работает. Спасибо за публикацию. - person SayeedHussain; 20.04.2015
comment
Как ни странно, я получаю эту проблему на некоторых из моих UITableViews, а не на других... - person David; 12.09.2015
comment
Если ваше табличное представление находится под панелью навигации, offset будет не 0, а -self.topLayoutGuide.length. - person Diogo T; 24.11.2015
comment
После долгой борьбы, наконец, ваше решение сработало - person amar; 14.10.2019

Ваше исправление выглядит хорошо, но я не думаю, что это ошибка.

Когда метод beginRefreshing вызывается вручную,

Когда нет доступных строк/ячеек, имеет смысл автоматически отображать элемент управления обновлением. Но когда доступны некоторые ячейки и когда мы вызываем начало обновления вручную (сценарий, в котором мы периодически обновляем на основе таймера), тогда он не должен анимировать/изменять смещение содержимого, поскольку это будет отвлекать пользователя, если он видит/читает содержимое в какая-то видимая ячейка.

person Dhandapani    schedule 29.04.2013
comment
Я попытался вызвать -beginRefreshing, когда установил количество разделов и строк равным 0. Он по-прежнему не показывает элемент управления обновлением. Если я правильно помню, раньше работало на iOS 6. Так что может быть баг. - person Hlung; 03.03.2014
comment
свифт4: self.uiRefresh?.beginRefreshing() UIView.animate(withDuration: 0.25, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState, animations: { self.tableView.contentOffset = CGPoint(x: 0, y: -(self.uiRefresh?.frame.size.height ?? 0)) }, completion: nil) - person brahimm; 26.03.2019