UIRefreshControl 控件在插入新行后永远旋转

UIRefreshControl control spins forever after inserting new row

我有一个UITableView,在添加新项目的UIViewController 的委托上,插入行。该行已正确插入。

但是UITableView上的UIRefreshControl拖拽UITableView后不会消失。

extension FeedViewController: AddPostDelegate {
    func didAddPost(_ userPost: UserPost) {
        self.postsWrapper?.posts.insert(PostWrapper(type: PostType.user(userPost)), at: 0)
        self.tableView.beginUpdates()
        self.tableView.insertRows(at: [
            IndexPath(row: 1, section: 0)
            ], with: .automatic)
        self.tableView.endUpdates()
        self.refresher.endRefreshing()//Does nothing
    }
}

viewDidLoad中:

refresher = UIRefreshControl()
tableView.addSubview(refresher)
refresher.addTarget(self, action: #selector(didDragScrollView), for: .valueChanged)
refresher.layer.zPosition = -1//otherwise in front of the header cell when refreshing (iOS 9.2)

如果我在尝试拉取刷新之前不先转到另一个视图而不是返回,它总是永远挂起旋转。

编辑: 在我添加 post.

之后,UIRefreshControl 似乎不再调用目标函数

关于为什么会发生这种情况有什么想法吗?如何解决?

尝试将您的 UIRefreshControl 分配到 UITableViewrefreshControl 属性 中,如下所示:

if #available(iOS 10.0, *) {
    tableView.refreshControl = refresher
} else {
    tableView.addSubview(refresher)
}

请注意,这需要 iOS 10.0 或更高版本,但我们很快就会得到 iOS 12.0,所以我认为您不应该支持低于 10.0[=14 的 iOS =]

确保在用户拉动刷新之前未调用 beginRefreshing()。如果 refreshControl.isRefreshingtrue 那么选择器不会被调用 "pull to refresh".

一个简单的测试:

let refreshControl = UIRefreshControl()

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl.addTarget(self, action: #selector(ViewController.refreshData), for: .valueChanged)
    tableView.refreshControl = refreshControl
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // sets refreshControl.isRefreshing to true
    // before the user initiates it
    refreshControl.beginRefreshing()
}

然后用户拉动刷新。因为 refreshControl.isRefreshingtrue 选择器不会被调用。如果在 viewDidAppear 中删除 refreshControl.beginRefreshing(),选择器将被调用:

@objc func refreshData() {
    print("refresh initiated")
    refreshControl.endRefreshing()
}