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.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
,所以不会调用选择器。如果您在viewDidAppear
中删除refreshControl.beginRefreshing()
,则将调用选择器:
@objc func refreshData()
print("refresh initiated")
refreshControl.endRefreshing()
【讨论】:
【参考方案2】:尝试将您的UIRefreshControl
分配给UITableView
的refreshControl
属性,如下所示:
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 控件在插入新行后永远旋转的主要内容,如果未能解决你的问题,请参考以下文章
IOS6.0自带下拉刷新控件UIRefreshControl
UIRefreshControl - 当UITableViewController在UINavigationController中时,beginRefreshing无效