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

Posted

技术标签:

【中文标题】UIRefreshControl 控件在插入新行后永远旋转【英文标题】:UIRefreshControl control spins forever after inserting new row 【发布时间】:2018-05-24 19:07:21 【问题描述】:

我有一个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)

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

编辑: 在我添加帖子后,UIRefreshControl 似乎不再调用目标函数。

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

【问题讨论】:

备注与您的问题无关。您正在将刷新控件添加为子视图,如果这是您需要的,那就太好了。但如果您不知道,有一个 UITableView (UIScrollView) 属性 refreshControl 可以开箱即用。 @AuRis 仅 10.0 或更新版本,因此出于某种原因,仍然支持用户低于该版本 - 那么您不能使用它。根据我的应用的用户统计,iOS 9 上仍有大约 8% 的用户 @KaylaGalway 如果您指的是 DispatchQueue.main.async,那么是的,我试过了 @daredevil1234 当然,如果您仍然支持 iOS 9,这是有道理的。关于刷新,您是通过“拉动刷新”操作启动它还是在某个地方调用 refresher.beginRefreshing() @AuRis 我实际上是在拉刷新。刷新在添加帖子之前可以正常工作,但在添加帖子之后就不行了。根据即时调试,看起来 RefreshControl 之后不再调用它的目标函数 【参考方案1】:

确保在用户拉动刷新之前未调用beginRefreshing()。如果refreshControl.isRefreshingtrue,则不会在“拉动刷新”时调用选择器。

一个简单的测试:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

您是否尝试过使用UITableViewController 而不是在您的UIViewController 中放置UITableView

以上是关于UIRefreshControl 控件在插入新行后永远旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何重启 UIRefreshControl 动画?

解析文件并在每次出现后插入新行

IOS6.0自带下拉刷新控件UIRefreshControl

如何在插入新行后立即将自动生成的主键值保存到第二列

UIRefreshControl - 当UITableViewController在UINavigationController中时,beginRefreshing无效

UIRefreshControl 不以 contentInset 集为中心