Обновить анимацию / прялка не останавливается/исчезает с "self.refreshControl.endRefreshing () " на iOS 10
Вот мой код:
func pullToRefresh() {
if Reachability().connectionStatus() == .Online {
self.homewebview.reload()
} else {
self.refreshControl.endRefreshing()
let alert = UIAlertView(title: "No Internet connection", message: "Please check your Internet connection.", delegate: nil, cancelButtonTitle: "Okay")
alert.show()
}
}
Когда подключение к интернету недоступно и пользователь тянет обновить предупреждение должно быть показано и анимация должна остановиться. Это отлично работает на iOS 9. Но на iOS 10 Beta 2 анимация не исчезает. Пользователь должен подтянуться, чтобы заставить его исчезнуть. Это ошибка iOS 10 или я делаю что-то не так?
P.S. Я уже пытался добавитьassert(NSThread.isMainThread())
, но это не помогло.4 ответа:
Я тоже столкнулся с тем же вопросом. Просто работайте вокруг: пожалуйста, измените, как показано ниже
let alert = UIAlertView(title: "No Internet connection", message: "Please check your Internet connection.", delegate: nil, cancelButtonTitle: "Okay") alert.show() self.refreshControl.endRefreshing()
Я ищу в Google, и некоторые ребята говорят о вмешательстве, когда показывают другой вид, но не знают основной причины
Я только что столкнулся с этой проблемой, и для тех, кто использует UIAlertController, вы можете попробовать что-то подобное следующему:
[self presentViewController:alert animated:TRUE completion:^{ [self.refreshControl endRefreshing]; }];
Это позволяет загрузочному спиннеру исчезнуть в фоновом режиме, как только появится предупреждение.
Эквивалент Swift:
present(alert, animated: true) { self.refreshControl.endRefreshing() }
У него были похожие проблемы, и он решил их таким образом. У меня есть функция для обработки всех сбоев (нет подключения, ошибки api), которая называется уведомлением, но я упрощу ее здесь.
Сначала я вызываю
endRefreshing
асинхронно (попробуйте без, Вы должны увидеть некоторые ошибки в консоли). Затем я задерживаю оповещение на 1 секунду, давая управлению обновлением достаточно времени для завершения.func updatedStatusFailed(notification: NSNotification) { DispatchQueue.main.async { self.refresher.endRefreshing() } self.helpers.delay(1.0, closure: { let alert = UIAlertController(title: "Error", message: "Error Description", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) self.present(alert, animated: true, completion: nil) }) }
Моя функция задержки происходит из класса helpers, потому что я использую ее несколько раз в моей апп.
func delay(_ delay:Double, closure:@escaping ()->()) { let when = DispatchTime.now() + delay DispatchQueue.main.asyncAfter(deadline: when, execute: closure) }
Во многих случаях вы можете вызывать api, когда представление загружается/появляется и имеет возможность обновить логику. В этом случае вы можете добавить эту строку, так что вы задержитесь только на секунду, если обновление обновляет:
let delayTime:Double = self.refresher.isRefreshing ? 1.0 : 0.0
Обновление: 20/1/16
Хотя мой несколько избитый ответ работает, в конце концов я решил иметь раздел в моем tableView для отображения ошибок, а не предупреждения. Это было намного больше кода и сложности, но UX-это много лучше.
Я думаю, когда мы
presenting
UIAlertController
в то же времяrefreshController
пытается остановить себя. Вот почему он не получает времени, чтобы перестать освежать и остается иногда. Поэтому в моем случае я поставил кодendRefreshing
через 1 секунду, и теперь он работает гладко.Вот код, который я использовал:
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { self.refreshControl.endRefreshing() }