UIRefreshControl无法正常工作。

6

刷新进度条只会到达95%,只有当你从屏幕顶部滑动到底部时,刷新才会生效。

lazy var refreshControl: UIRefreshControl = {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action:
       #selector(VFeedVC.refresh(_:)),
                            for: .valueChanged)
    return refreshControl
}()

override func viewDidLoad() {
    self.tableView.addSubview(refreshControl)
}

func refresh(_ sender: Any) {
    Metric.sendEvent("RefreshFeed")
    self.refreshControl.beginRefreshing()
    self.getFeeds(self.user.id)
}

func getFeeds(_ userId: Int) {
    VNetwork.getFeeds(userId) { feeds in
        self.feeds = feeds
        self.tableView.isHidden = self.feeds.count == 0
        self.configureCells()
        self.refreshControl.endRefreshing()
        self.tableView.reloadData()
    }
}

enter image description here

4个回答

3

以下内容在iOS 11上适用:

override func viewDidLoad() {
    self.tableView.refreshControl = refreshControl
    self.tableView.addSubview(refreshControl)
}

此外,您无需显式告诉刷新控件开始刷新,因此以下内容就足够了:
func refresh(_ sender: Any) {
    Metric.sendEvent("RefreshFeed")
    self.getFeeds(self.user.id)
}

同样要确保在VNetwork.getFeeds(userId) { feeds in}回调函数中,你需要在主线程上执行。


1
这个问题出现在Storyboard中,如果你的ViewController选项是“自由形式”的话。将其调整为固定大小的ViewController,这对我很有帮助。 - Artyom Vlasenko

0

使用 self.tableView.refreshControl = refreshControl,您可以直接将refreshControl添加到tableview中,而且您不必调用 self.refreshControl.beginRefreshing()

lazy var refreshControl: UIRefreshControl = {
   let refreshControl = UIRefreshControl()
   refreshControl.addTarget(self, action:
       #selector(VFeedVC.refresh(_:)),
                            for: .valueChanged)
   return refreshControl
}()
override func viewDidLoad() {

self.tableView.refreshControl = refreshControl
self.tableView.addSubview(refreshControl)
}
func refresh(_ sender: Any) {
    Metric.sendEvent("RefreshFeed")
    self.getFeeds(self.user.id)
}

func getFeeds(_ userId: Int) {
    VNetwork.getFeeds(userId) { feeds in
        self.feeds = feeds
        self.tableView.isHidden = self.feeds.count == 0
        self.configureCells()
        self.refreshControl.endRefreshing()
        self.tableView.reloadData()
    }
}

谢谢,这对我很有帮助! - Artyom Vlasenko
@ArtemVlasenko,我指的是你接受了一个回答,这个回答只是重复了我之前已经建议过的内容。所以虽然这里没有警察,但公平起见,你应该接受我的回答(除非有什么我没看到的东西,使Timm的回答比我的更好)。 - Milan Nosáľ
@MilanNosáľ 好的,兄弟) - Artyom Vlasenko

0
在tableView.reloadData()之后加上refreshControl.endRefreshing(),像这样:
tableView.reloadData()
DispatchQueue.main.async {
    self.refreshControl.endRefreshing()
}

-1

你可以试试这个,它对我有效。

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
        refreshControl = UIRefreshControl()
        refreshControl.tintColor = UIColor.white
        self.tblPartyList.addSubview(refreshControl)
        refreshControl.addTarget(self, action:#selector(handleRefresh(_:)), for: UIControlEvents.valueChanged)
}
@objc func handleRefresh(_ refreshControl: UIRefreshControl) {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接