【问题标题】:refresh controller freeze after changing tap tab bar quickly快速更改点击标签栏后刷新控制器冻结
【发布时间】:2020-04-09 04:32:11
【问题描述】:

我使用刷新控制器。当我在刷新动画完全结束后点击标签栏项目时效果很好。但是如果我在动画完成之前很快点击栏项目,它将被冻结。我尝试在 viewDidApper 中使用 refreshControl.endRefreshing()。我也尝试在 viewWillDisappear 中使用 refreshControl.endRefreshing()。这个错误仍然发生。以下是我的代码和快照。

快照:https://imgur.com/a/UNvQbA8

演示视频:https://youtu.be/cZMurwiwfjI

let refreshControl: UIRefreshControl = UIRefreshControl()
@IBOutlet weak var myScrollView: UIScrollView!
@IBOutlet weak var noDataView: UIView!
@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(UINib.init(nibName: "MessageListCell", bundle: nil), forCellReuseIdentifier: "MessageListCell")
    tableView.delegate = self
    tableView.dataSource = self       
    refreshControl.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)

    self.tableView.isHidden = true
    self.myScrollView.isHidden = false
}

我把 refreshControl.endRefreshing() 放在这里。好像不行。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.refreshControl.endRefreshing()
    if !oneReload {
        getList()
        oneReload = true
    }
}

我还尝试在添加子视图之前放置 refreshControl.endRefreshing()。还是不行。

private func getList(){

   if self.viewData.count > 0{
     self.tableView.addSubview(self.refreshControl)
     self.tableView.isHidden = false
     self.myScrollView.isHidden = true         
     self.tableView.reloadData()
   }else{
     self.myScrollView.addSubview(self.refreshControl)
     self.myScrollView.isHidden = false
     self.tableView.isHidden = true
   }   
}

@objc func refresh(){
    refreshControl.endRefreshing()
    self.getList()
}

我认为这会发生,因为视图控制器在更改选项卡栏选定视图之前已冻结。下次我回到视图。它显示冻结动画。我可以解决这个问题吗?请帮忙。谢谢。

【问题讨论】:

  • 你是否尝试将它放在 viewDidDisappear 中
  • @jbiser361 是的,我尝试将 endRefreshing() 放在 viewDidDisappear 中。问题仍然存在。我更新了一个演示视频。请帮忙。谢谢。
  • 尝试隐藏

标签: swift uitabbarcontroller uirefreshcontrol


【解决方案1】:

尝试将刷新方法放在主线程上。

@objc func refresh(){
    DispatchQueue.async.main {
        refreshControl.endRefreshing()
        self.getList()
    }
}

【讨论】:

  • 感谢您的评论。但是在我使用您的方法后,这个问题仍然存在。我更新了一个演示视频。我认为这可以帮助您了解我遇到的情况。请帮忙。谢谢。
  • 嗯,我想我明白了。对于您的 refreshControl,您需要在方法调用结束时在 getList() 和 getList() 方法内部绑定操作 endRefreshing。
  • 并从 viewDidAppear 中删除 self.refreshControl.endRefreshing()
  • 你能解释更多关于评论的内容吗?我在 viewDidLoad 中使用 refreshControl.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)。刷新函数包括 getList 函数。问题是动画尚未完成时的方法。所以我认为控制器没有调用绑定函数。
  • 声明正确,需要在viewDidLoad方法上添加你的refreshControl。方法是,您开始刷新(出现活动控件)一切都重新加载,然后刷新控件消失。如果数据或重新加载还没有完成,那么动画的意义何在?
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2020-07-29
  • 2018-08-04
  • 2015-08-17
相关资源
最近更新 更多