点击TabBar时更新当前的UIViewController UI

时间:2019-02-04 21:59:04

标签: swift uitabbarcontroller uitabbar

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

当用户点击TabBar时,我准备了一个大约需要六秒钟的大数据列表。我可以将活动显示在所有地方,但是当他们点击TabBar时。

该指示器似乎正在“运行”,因为当已定名的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来阻塞主线程中的所有内容。

1 个答案:

答案 0 :(得分:0)

已解决:

添加了一个布尔值:

 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)
相关问题