Обновить анимацию / прялка не останавливается/исчезает с "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 2

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