用于触发 segue 时拉动以刷新视图不关闭
Pull to refresh view not dismissing when used to trigger a segue
我想使用下拉刷新 UI 操作来触发模式视图的转场。该操作运行良好,按预期触发了模态转场。但是当我关闭模态时,刷新控件视图仍然可见。
我在 segue 之前正确地调用了 refreshControl.endRefreshing()
,但问题似乎是 UI 没有时间在 segue 之前完成关闭刷新控制视图的动画触发器,所以它会吸到一半。
如果我在触发 segue 之前放置一个小的延迟 (0.4s) 这种帮助,因为它允许动画完成,但它感觉像 hack。另外,如果用户在 tableview 上下拉非常慢,并且在 0.4 秒后释放下拉,也会出现同样的问题。
如何确保在关闭模态视图时刷新控件不可见?我的想法(但我找不到实现的方法)包括:
1) 确保取消刷新控件的动画有时间在触发 segue 之前完成。
2)当我关闭模态时,关闭父视图上的刷新控件视图。
但我无法使上述任何一个工作。
对于 1) 延迟有效(有时),但感觉就像一个 hack。
使用 2) tableView.reloadData() 仅重新加载表视图,而不是整个视图,因此刷新控件仍然存在。
如有任何帮助,我们将不胜感激。
下面是实现刷新控制的代码。
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(pullToAddCard(_:)), for: .valueChanged)
return refreshControl
}()
这是由刷新控件触发的代码
@objc func pullToAddCard(_ refreshControl: UIRefreshControl) {
refreshControl.endRefreshing()
delay(0.4, closure: {
self.performSegue(withIdentifier: "segueFromPlaylistDetailToNewCard", sender: self)
})
}
这是我导航回父视图(通过关闭模态视图)时父视图的屏幕截图。'stuck' 刷新控制视图在顶部可见。
只需添加
refreshControl?.endRefreshing()
你的viewWillAppear
方法
我刚刚使用下面的故事板尝试了以下内容,效果很好……
class TableViewController: UITableViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
refreshControl?.endRefreshing()
}
@IBAction func unwind(sender: UIStoryboardSegue) {
}
}
好的,我找到了解决办法。 @Ashley Mills 的回答给了我一个主意。在 viewWillAppear
中,我调用 refreshControl.beginRefreshing()
,然后立即调用 refreshControl.endRefreshing()
,这有效!
出于某种原因,仅仅调用 refreshControl.endRefreshing()
是不够的。
我想使用下拉刷新 UI 操作来触发模式视图的转场。该操作运行良好,按预期触发了模态转场。但是当我关闭模态时,刷新控件视图仍然可见。
我在 segue 之前正确地调用了 refreshControl.endRefreshing()
,但问题似乎是 UI 没有时间在 segue 之前完成关闭刷新控制视图的动画触发器,所以它会吸到一半。
如果我在触发 segue 之前放置一个小的延迟 (0.4s) 这种帮助,因为它允许动画完成,但它感觉像 hack。另外,如果用户在 tableview 上下拉非常慢,并且在 0.4 秒后释放下拉,也会出现同样的问题。
如何确保在关闭模态视图时刷新控件不可见?我的想法(但我找不到实现的方法)包括: 1) 确保取消刷新控件的动画有时间在触发 segue 之前完成。 2)当我关闭模态时,关闭父视图上的刷新控件视图。
但我无法使上述任何一个工作。 对于 1) 延迟有效(有时),但感觉就像一个 hack。 使用 2) tableView.reloadData() 仅重新加载表视图,而不是整个视图,因此刷新控件仍然存在。
如有任何帮助,我们将不胜感激。
下面是实现刷新控制的代码。
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(pullToAddCard(_:)), for: .valueChanged)
return refreshControl
}()
这是由刷新控件触发的代码
@objc func pullToAddCard(_ refreshControl: UIRefreshControl) {
refreshControl.endRefreshing()
delay(0.4, closure: {
self.performSegue(withIdentifier: "segueFromPlaylistDetailToNewCard", sender: self)
})
}
这是我导航回父视图(通过关闭模态视图)时父视图的屏幕截图。'stuck' 刷新控制视图在顶部可见。
只需添加
refreshControl?.endRefreshing()
你的viewWillAppear
方法
我刚刚使用下面的故事板尝试了以下内容,效果很好……
class TableViewController: UITableViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
refreshControl?.endRefreshing()
}
@IBAction func unwind(sender: UIStoryboardSegue) {
}
}
好的,我找到了解决办法。 @Ashley Mills 的回答给了我一个主意。在 viewWillAppear
中,我调用 refreshControl.beginRefreshing()
,然后立即调用 refreshControl.endRefreshing()
,这有效!
出于某种原因,仅仅调用 refreshControl.endRefreshing()
是不够的。