使命:通用装载程序
创建一个通用LoadingViewController
来处理加载并显示任何UIView的加载指示器(见图)。
问题:并不总是显示
如果用户单击立即下载相关数据的刷新按钮(左上角),则不会显示指示符,同时应显示加载指示符。
但是,如果用户单击过滤器图标(右上角)并显示另一个UIView(推送)并选择一些选项并被委托回mapView,则加载器指示符将按预期显示 - 在加载数据期间然后被删除。 / p>
在两个实例中,持有loadingIndicator的子视图的框架似乎很好(0,0,375,667)。什么可以发挥作用?
刷新按钮
@IBAction func refreshPlaces(sender: AnyObject) {
downloadStores = true
updateStores()
}
从过滤器委派功能
func filterViewDidFinish(controller: BudgetTableViewController, download: Bool) {
// Dismiss modal
self.navigationController!.popToRootViewControllerAnimated(true) // Pop back to map
// Update stores
downloadStores = download
updateStores()
}
更新商店
func updateStores(){
// Display loading indicator
println("Display loading indicator")
let subViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoadingViewController") as! LoadingViewController
let loadingSubView: UIView = subViewController.view
loadingSubView.tag = 1 // Unique identifier
// Add loading indicator
self.navigationController!.view.addSubview(loadingSubView)
// Verify frame is OK
println("Frame: \(self.navigationController!.view.viewWithTag(1)?.frame)")
// Async
dispatch_async(dispatch_get_main_queue(), {
// Update location
subViewController.status.text = "Updating your location"
self.getCoordinates()
// Get stores
if self.downloadStores == true {
subViewController.status.text = "Finding stores nearby"
self.getStores()
}
// Create markers
self.googleMapsMarkers()
// Dismiss loading indicator
println("Remove loading indicator")
self.navigationController!.view.viewWithTag(1)?.removeFromSuperview()
})
}
更新
加载指示器也会显示在“刷新”按钮上。如果我删除self.navigationController!.view.viewWithTag(1)?.removeFromSuperview()
。
问题是为什么在下载数据之前将其删除(即异步查询中更高的功能已完成)?
我理解async que,因为事情在后台运行直到完成,并且进入que的函数只应在que中的前一个函数完成时执行 - 但也许我错了?
新手快......:)
答案 0 :(得分:0)
您不应将视图直接添加到导航控制器的视图中。如果要呈现覆盖当前视图的子视图控制器,则应通过调用正确的api方法正确执行此操作:
subViewController.view.frame = self.view.bounds;
[self.view addSubview:subViewController.view];
[self addChildViewController:subViewController];
[subViewController didMoveToParentViewController:self];
答案 1 :(得分:-1)
也许this可能对您有所帮助。看看UIView扩展,其中添加了活动指示器以查看