【问题标题】:Update current UIViewController UI upon tap of TabBar点击 TabBar 时更新当前 UIViewController UI
【发布时间】:2019-02-04 21:59:03
【问题描述】:

我试图在用户点击某个 TabBar 项目时显示活动指示器。我认为,我的问题在于 UI 主线程被冻结。

当用户点击 TabBar 时,我准备了一个大约需要 6 秒的大数据列表。我让活动显示在任何地方,但是当他们点击 TabBar 时。

似乎指示器正在“运行”,因为当 segued uitableviewcontroller 显示时,它正在显示指示器。但这为时已晚,而且 dispatch 似乎也没有任何作用。

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if let visibleViewCtrl = UIApplication.shared.keyWindow?.visibleViewController {
        // do whatever you want with your `visibleViewCtrl`
        print (String.init(describing: visibleViewCtrl.classForCoder))
        DispatchQueue.main.async{

            let aprogressView = ProgressView(Message: "Filtering...",
                                        Theme:.Dark,
                                        IsModal:true);

            visibleViewCtrl.view.addSubview(aprogressView)
            aprogressView.show()
        }
    }
    return true
}

好的,所以问题是它要去一个 tableview 控制器,它几乎立即尝试获取部分中的行,然后首先是 fetchrequest,它阻塞了主线程上的所有内容。

【问题讨论】:

  • 将指标代码放入目标视图控制器的 dispatchqueue.main.async { } 块中
  • 我这样做了:编辑了我的问题
  • 在视图中添加此代码确实加载视图控制器的方法,并在显示活动指示器后准备数据列表。
  • 我们需要查看代码来了解数据是如何准备的。如果您在即将呈现的 viewController 的主队列上执行此操作,那么它将冻结 UI 直到它完成然后呈现(显示您的进度视图)
  • 不要把dispatchqueue代码放在方法里把它放在viewcontroller viewdidload哪个标签栏打开它

标签: swift uitabbarcontroller uitabbar


【解决方案1】:

已解决:

添加了一个布尔值:

 var loadData = false

 override func viewDidAppear(_ animated: Bool) {
        loadData = true
        self.tableView.reloadData()
 }

然后是代表:

func sectionIndexTitles(for tableView: UITableView) -> [String]? {
    if loadData == false {
        return nil
    }
    return  searchFetchedResultsController.sectionIndexTitles

}



func numberOfSections(in tableView: UITableView) -> Int {
    if loadData == false {
        return 0
    }

现在它将立即转换到新控制器,因此我现在可以显示来自 viewWillAppear 的反馈:

appDelegate.progressView = ProgressView(Message: "Filtering Brands", Theme:.Dark, IsModal:true);
    appDelegate.progressView!.show()

这将与程序显示一起使用

    self.navigationController?.pushViewController(vc, animated: false)

【讨论】:

  • 您现在可以接受自己的解决方案。不要将解决方案放在问题中。谢谢。
猜你喜欢
  • 2011-01-09
  • 2019-03-25
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多