刷新 animation/spinning 轮子不会 stop/disappear 在 iOS 10 上使用“self.refreshControl.endRefreshing()”

Refresh animation/spinning wheel doesn't stop/disappear with “self.refreshControl.endRefreshing()” on 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()) 但没有帮助。

我也遇到了同样的问题。解决方法:请按以下方式更改

    let alert = UIAlertView(title: "No Internet connection", message: "Please check your Internet connection.", delegate: nil, cancelButtonTitle: "Okay")
    alert.show()
    self.refreshControl.endRefreshing()

我在 Google 中搜索,有些人在显示其他视图时谈论干扰但不知道根本原因

遇到过类似的问题,就是这样解决的。我有一个函数来处理所有失败(无连接,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)
    })
}

我的延迟函数来自一个助手class,因为我在我的应用程序中多次使用它。

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}

在许多情况下,您可能会在视图 loads/appears 时调用 api 并具有刷新逻辑。在这种情况下,您可能希望添加此行,以便在刷新时仅延迟一秒钟:

let delayTime:Double = self.refresher.isRefreshing ? 1.0 : 0.0

更新:2016 年 1 月

尽管我的答案有些古怪,但最后我选择在我的 tableView 中有一个部分来显示错误,而不是警报。这是更多的代码和复杂性,但用户体验要好得多。

我刚遇到这个问题,对于那些使用 UIAlertController 的人,您可能希望尝试类似于以下内容的操作:

[self presentViewController:alert animated:TRUE completion:^{
    [self.refreshControl endRefreshing];
}];

一旦显示警报,加载微调器就会在后台消失。


Swift 等价于:

present(alert, animated: true) {
    self.refreshControl.endRefreshing()
}

我认为当我们 presenting 同时 UIAlertController refreshController 正在试图停止自己。这就是为什么它没有时间停止刷新并且有时会停留的原因。所以在我的例子中,我在 1 秒后放置了 endRefreshing 代码,现在它工作顺利。

这是我使用的代码:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                    self.refreshControl.endRefreshing()
                }