【问题标题】:Pull to refresh view not dismissing when used to trigger a segue拉动以刷新视图在用于触发 segue 时不会关闭
【发布时间】:2018-09-23 14:10:33
【问题描述】:

我想使用下拉刷新 UI 操作来触发模式视图的转场。该操作工作正常,按预期触发模态转场。但是当我关闭模式时,刷新控件视图仍然可见。

我在 segue 之前正确调用了refreshControl.endRefreshing(),但问题似乎是 UI 没有时间完成在触发 segue 之前关闭刷新控制视图的动画,所以它被吸到一半.

如果我在触发 segue 之前放置一个小延迟(0.4 秒),这种帮助,因为它允许动画完成,但感觉就像一个 hack。另外,如果用户在 tableview 上拉得很慢,并且在 0.4 秒后才释放下拉,也会出现同样的问题。

当我关闭模式视图时,如何确保刷新控件不可见?我的想法(但我找不到实现的方法)包括: 1) 确保关闭刷新控件的动画在触发 segue 之前有时间完成。 2)当我关闭模式时,关闭父视图上的刷新控制视图。

我无法让上述任何一个工作。 1)延迟有效(有时),但感觉就像一个黑客。 使用 2) tableView.reloadData() 仅重新加载 tableview,而不是整个视图,因此刷新控制仍然存在。

任何帮助将不胜感激。

这里是实现刷新控件的代码。

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)

    })

}

这是我导航回到父视图时的屏幕截图(通过关闭模式视图)。“卡住”刷新控制视图在顶部可见。

【问题讨论】:

    标签: ios swift pull-to-refresh


    【解决方案1】:

    只需添加

    refreshControl?.endRefreshing()
    

    到您的viewWillAppear 方法


    我刚刚使用下面的故事板尝试了以下操作,效果很好……

    class TableViewController: UITableViewController {
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            refreshControl?.endRefreshing()        
        }
    
        @IBAction func unwind(sender: UIStoryboardSegue) {            
        }
    }
    

    【讨论】:

    • 感谢@Ashley Mills,但我只是仔细检查了一遍,由于某种原因,您的解决方案对我不起作用。但它确实给了我一个想法。看我的回答。如果您知道为什么在endRefreshing() 之前立即调用beginRefreshing() 可以解决问题,我很想知道。
    【解决方案2】:

    好的,我找到了解决方案。 @Ashley Mills 的回答给了我一个想法。在viewWillAppear 中我调用refreshControl.beginRefreshing(),然后立即调用refreshControl.endRefreshing(),这样就可以了!

    出于某种原因,仅仅调用refreshControl.endRefreshing() 是不够的。

    【讨论】:

    • 仅调用refreshControl.endRefreshing() 是不够的,您需要检查控制流是否到达您调用它的位置。 viewWillAppear 总是被调用,这就是 refreshContol.endRefreshing 起作用的原因。
    • 如果 self.refreshControl.isRefreshing{//do something }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多