子视图/加载指示器不可见

时间:2015-05-20 16:03:03

标签: ios swift asynchronous uiview subview

使命:通用装载程序

创建一个通用LoadingViewController来处理加载并显示任何UIView的加载指示器(见图)。

enter image description here

问题:并不总是显示

如果用户单击立即下载相关数据的刷新按钮(左上角),则不会显示指示符,同时应显示加载指示符。

但是,如果用户单击过滤器图标(右上角)并显示另一个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中的前一个函数完成时执行 - 但也许我错了?

新手快......:)

2 个答案:

答案 0 :(得分:0)

您不应将视图直接添加到导航控制器的视图中。如果要呈现覆盖当前视图的子视图控制器,则应通过调用正确的api方法正确执行此操作:

subViewController.view.frame = self.view.bounds;
[self.view addSubview:subViewController.view];
[self addChildViewController:subViewController];
[subViewController didMoveToParentViewController:self];

答案 1 :(得分:-1)

也许this可能对您有所帮助。看看UIView扩展,其中添加了活动指示器以查看