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
分配到 UITableView
的 refreshControl
属性 中,如下所示:
if #available(iOS 10.0, *) {
tableView.refreshControl = refresher
} else {
tableView.addSubview(refresher)
}
请注意,这需要 iOS 10.0 或更高版本,但我们很快就会得到 iOS 12.0,所以我认为您不应该支持低于 10.0[=14 的 iOS =]
确保在用户拉动刷新之前未调用 beginRefreshing()
。如果 refreshControl.isRefreshing
是 true
那么选择器不会被调用 "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.isRefreshing
是 true
选择器不会被调用。如果在 viewDidAppear
中删除 refreshControl.beginRefreshing()
,选择器将被调用:
@objc func refreshData() {
print("refresh initiated")
refreshControl.endRefreshing()
}
我有一个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
分配到 UITableView
的 refreshControl
属性 中,如下所示:
if #available(iOS 10.0, *) {
tableView.refreshControl = refresher
} else {
tableView.addSubview(refresher)
}
请注意,这需要 iOS 10.0 或更高版本,但我们很快就会得到 iOS 12.0,所以我认为您不应该支持低于 10.0[=14 的 iOS =]
确保在用户拉动刷新之前未调用 beginRefreshing()
。如果 refreshControl.isRefreshing
是 true
那么选择器不会被调用 "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.isRefreshing
是 true
选择器不会被调用。如果在 viewDidAppear
中删除 refreshControl.beginRefreshing()
,选择器将被调用:
@objc func refreshData() {
print("refresh initiated")
refreshControl.endRefreshing()
}