快速更改点击标签栏后刷新控制器冻结
Posted
技术标签:
【中文标题】快速更改点击标签栏后刷新控制器冻结【英文标题】: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 中。问题仍然存在。我更新了一个演示视频。请帮忙。谢谢。 尝试隐藏 【参考方案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。方法是,您开始刷新(出现活动控件)一切都重新加载,然后刷新控件消失。如果数据或重新加载还没有完成,那么动画的意义何在?以上是关于快速更改点击标签栏后刷新控制器冻结的主要内容,如果未能解决你的问题,请参考以下文章