快速更改点击标签栏后刷新控制器冻结

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。方法是,您开始刷新(出现活动控件)一切都重新加载,然后刷新控件消失。如果数据或重新加载还没有完成,那么动画的意义何在?

以上是关于快速更改点击标签栏后刷新控制器冻结的主要内容,如果未能解决你的问题,请参考以下文章

跳转到其他页面或删除视图标题栏后如何释放控制器

隐藏导航栏和标签栏后 UICollectionView 框架发生变化

更改 UIAppearence 后刷新标签栏

根据标签栏索引更改视图控制器的属性?

js如何实现点击导航栏后相应导航栏实现选中效果的切换

标签栏/导航刷新