Ios UIRefreshControl在插入新行后永远旋转

Ios UIRefreshControl在插入新行后永远旋转,ios,swift,uitableview,uirefreshcontrol,Ios,Swift,Uitableview,Uirefreshcontrol,我有一个UITableView,它在添加新项的UIViewController的委托上插入行。正确插入该行 但是,在此之后拖动UITableView时,UITableView上的UIRefreshControl不会消失 extension FeedViewController: AddPostDelegate { func didAddPost(_ userPost: UserPost) { self.postsWrapper?.posts.insert(PostWrap

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

但是,在此之后拖动
UITableView
时,UITableView上的
UIRefreshControl
不会消失

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
分配到
UITableView
refreshControl
属性中,如下所示:

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

请注意,这需要iOS 10.0或更高版本,但我们很快就会推出iOS 12.0,因此我认为您不应该支持低于10.0的iOS。请确保在用户拉刷新之前未调用
beginRefreshing()
。如果
refreshControl.isRefreshing
true
,则不会调用选择器“拉入刷新”

一个简单的测试:

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.isRefreshing
true
选择器将不会被调用。如果在
viewdide
中删除
refreshControl.beginRefreshing()
,将调用选择器:

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

与你的问题无关的评论。您正在将刷新控件添加为子视图,如果您需要的话,这非常好。但是如果您不知道,有一个
UITableView
UIScrollView
)属性
refreshControl
,可以开箱即用。@AuRis只有10.0或更高版本,因此出于某种原因,对于支持用户,仍然低于该属性-那么您不能使用它。根据我的应用程序的用户统计,iOS上仍有大约8%的用户9@KaylaGalway如果您指的是DispatchQueue.main.async,那么是的,我试过了that@daredevil1234当然,如果您仍然支持iOS 9,这是有意义的。关于刷新,您是通过“拉动刷新”操作启动它,还是在某处调用
refresher.beginRefreshing()
?@AuRis我实际上是拉动刷新的。在添加帖子之前,刷新可以正常工作,但在添加帖子之后,刷新不能正常工作。根据im调试结果,RefreshControl似乎不再调用其“目标函数”,之后您是否尝试使用
UITableViewController
而不是在
UIViewController
中放置
UITableView