swift - 点击 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,它阻塞了主线程上的所有内容。
解决方案
解决了:
添加了一个布尔值:
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)
推荐阅读
- python - RuntimeError:尺寸不匹配,m1:[28 x 28],m2:[784 x 128]
- swift - 如果通过 Button_Action swift 调用 LocationManager,为什么位置服务背景不起作用
- powershell - PowerShell 中的点 (.) 和与号 (&) 有什么区别?
- python - 涉及牛顿法的求根问题
- ruby-on-rails - Rails - 如何修复 secrets.yml.enc
- python - pip 配置了需要 TLS/SSL 的位置,但是 Python 中的 ssl 模块不可用错误
- php - 如何使用错误信息关闭 Laravel 节目?
- php - PHP 内爆值
- javascript - 在 iframe 上打开 Bootstrap 模态窗口
- python-3.x - tkinter 从一个单独的类中调用祖父母实例变量时出错