首页 > 解决方案 > 点击 TabBar 时更新当前 UIViewController UI

问题描述

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

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

似乎指示器正在“运行”,因为当 segued uitableviewcontroller 显示时,它正在显示指示器。但这为时已晚,调度似乎也没有做任何事情。

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,它阻塞了主线程上的所有内容。

标签: swiftuitabbarcontrolleruitabbar

解决方案


解决了:

添加了一个布尔值:

 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)

推荐阅读