IOS 10.0 UIRefreshControl не показывает индикатор

Я использую UITableView, у которого есть функция Pull down to refresh, но spinner для pull down to refresh не появляется, когда я вызываю [self.refreshControl beginRefreshing]

Вышеупомянутый код вызывается внутри viewDidLoad, потому что таблица сначала загружает некоторые данные. Spinner отлично работает, если я выполнил откат, чтобы обновить его после первоначального обновления. Название появляется, но не счетчик.

Невозможно решить эту проблему. Он отлично работает на iOS 9.3.2, но не на iOS 10.

Вот код, который я использую в настоящее время.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setupView];
    [self customSetup];
    self.refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Updating Discounts..."];
    [self.refreshControl addTarget:self action:@selector(reloadDeals) forControlEvents:UIControlEventValueChanged];
    [self.refreshControl beginRefreshing];
    [self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES];
}

Спасибо за вашу помощь заранее

Ответы

Ответ 1

перед кодом:

[refreshControl beginRefresh]

введите код:

[refreshControl layoutIfNeeded]

Ответ 2

Отложенный вызов для обновления в viewDidLoad работал у меня:

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.refreshControl beginRefreshing];
});

Ответ 3

Вам нужно позвонить [self.view layoutIfNeeded], чтобы исправить его в iOS 10. Для моего случая было достаточно поставить вызов viewDidLoad (я использовал раскадровку в этом проекте). Для других случаев viewWillAppear подходит лучше.

- (void)viewDidLoad
  {
   [super viewDidLoad];
   [self.view layoutIfNeeded];
   ...

Ответ 4

Это известная и зарегистрированная ошибка в iOS 10.

Радар rdar://27468436

Я не уверен, есть ли какие-либо обходные пути.

Ответ 5

То же, что и @jpros, но в быстрой

if #available(iOS 10.0, *) {
    tableView.refreshControl = refreshControl
} else {
    tableView.addSubview(refreshControl)
}
refreshControl.layoutIfNeeded()
refreshControl.beginRefreshing()

Ответ 6

Я смог исправить это, позвонив из viewDidLoad():

refreshControl.layoutIfNeeded()

Ответ 7

В iOS10 мы должны добавить UIRefreshControl, используя setRefreshControl UITableView или UICollectionView.

if([self.tableView respondsToSelector:@selector(setRefreshControl:)]) {
    [self.tableView setRefreshControl:self.refreshControl];
}
else {
    [self.tableView addSubview:self.refreshControl];
}
[self.refreshControl layoutIfNeeded];
[self.refreshControl beginRefreshing];

Ответ 8

Если индикатор обновления не отображается, попробуйте включить вертикальный отскок в Интерфейсном Разработчике для просмотра таблицы или прокрутки.