Потяните, чтобы обновить загрузку tableviewcontroller

Я использую UIRefreshControl, чтобы включить жест обновления для обновления в табличном представлении.

Я использовал раскадровку для настройки RefershControl, а в моем TableViewController используется следующий код для привязки метода к RefeshControl:

self.refreshControl?.addTarget(self, action: Selector("getData"), forControlEvents: UIControlEvents.ValueChanged)

В конце метода getData() я вызываю метод reloadData() для представления таблицы и метод stopRefreshing() для элемента управления обновлением.

Это работает нормально. Я могу потянуть, чтобы обновить, и таблица обновится.

Следующее, что я хочу, это запустить RefreshControl при загрузке TableViewController. Чтобы показать пользователю, что приложение получает данные. Я попытался вручную запустить следующий код:

self.refreshCorntrol?.beginRefreshing()
getData()

Он перезагружает данные, но анимация не работает должным образом. Стол остается пустым. Затем, когда все данные извлекаются, таблица сбрасывается (например, когда я вручную вытягиваю для обновления), а затем сразу же возвращается обратно.

Кто-нибудь знает, можно ли это изменить/исправить?


person Bart C    schedule 08.04.2015    source источник


Ответы (1)


Две вещи могут происходить.

<сильный>1. Обновления пользовательского интерфейса должны отправляться в основном потоке.

Вы обновляете tableView, используя его метод .reloadData(), который считается обновлением пользовательского интерфейса. При этом вы должны вызывать .reloadData() в основном потоке. Хотя это уже должно быть сделано автоматически для вас, я столкнулся с некоторыми случаями, когда мне нужно вручную переместить это в основной поток. Это можно сделать с помощью

DispatchQueue.main.async {
  // Update UI ie. self.tableView.reloadData()
}

внутри вашей функции.

<сильный>2. Программные обновления по запросу не всегда выполняются для .valueChanged

Важно вызывать .valueChanged (или, как у вас в коде, UIControlEvents.ValueChanged) при вызове функции обновления по запросу, чтобы она знала, для чего вы обновляете. Когда пользовательский запрос обновляется, ваша программа уже делает это в сегменте forControlEvents вашего объявления refreshController. Однако, когда вы вызываете его вручную из своего кода, он не делает этого по умолчанию. Вместо этого вы должны передать действие, используя sendActions. Это можно сделать с помощью

self.refreshControl?.beginRefreshing()
self.refreshControl?.sendActions(for: UIControlEvents.ValueChanged)
getData()

для вызова обновления по запросу, а не просто для вызова .beginRefreshing

Послесловие

Я столкнулся с подобной проблемой несколько дней назад и разместил вопрос о переполнении стека здесь (я указываю авторство на случай, если вы найдете там свой ответ, и потому что именно оттуда я взял для вас свое первое решение).

person ntrupin    schedule 18.12.2018