跨视图

时间:2016-02-03 00:35:33

标签: ios swift alamofire uiactivityindicatorview

我正在使用此插件:https://github.com/icanzilb/SwiftSpinner/

要显示一个活动指示器,它很容易:

SwiftSpinner.show("Loading Data")

但是,我有一个观点,我来自:

performSegueWithIdentifier("ViewC1Segue", sender: self)

单击表格视图单元格时。

问题是,当我转到这个新视图时,会出现一个初始的空白屏幕,因为数据是通过alamofire加载的,需要一些时间来加载。

有没有办法在一个视图上加载活动微调器,让视图在它下面改变,然后当我在新视图上使用.hide()时,微调器将消失?

还有另一个困境:

我尝试将swift微调器添加到新的viewDidLoad上。但是,它可以工作,大部分内容都是在ViewDidAppear函数下加载的。一旦我添加此函数,微调器就无法加载。

好的,我还有另外一个问题:

在数据加载之前,在开头不显示空白视图的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果你想让微调器有几个视图,你可以为它创建一个新的LoadingViewController和一个nib,将它设置为backgroundColor透明,在当前上下文中显示LoadingViewController(或者结束)全屏)并仅在LoadingViewController上显示微调器。

这样,您可以在任何视图上显示微调器,并从另一个视图中将其关闭。下面是一些代码。

为它创建LoadingViewController及其委托:

protocol LoadingViewControllerDelegate {
    func didFinishLoading(controller: LoadingViewController)
}

class LoadingViewController: UIViewController {
    var delegate: LoadingViewControllerDelegate? = nil

    override func viewDidLoad() {
        // Do your spinner code here
    }

    // Delegate function, should be fired when loading is done.
    func finished() {
        if self.delegate != nil {
            self.delegate?.didFinishLoading(self)
        }
    }
}

在第一个ViewController中,显示LoadingViewController:

let loading = LoadingViewController(nibName: "LoadingViewController", bundle: nil)
loading.modalTransitionStyle = .CrossDissolve
loading.modalPresentationStyle = .OverFullScreen
presentViewController(loading, animated: true, completion: nil)

在第二个ViewController中,实现一个接收LoadingViewController的方法:

var loading: LoadingViewController? = nil

再次在你的第一个ViewController中,将数据发送到第二个:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ViewC1Segue" {
        let destination = segue.destinationViewController as! SecondViewController
        destination.loading = self.loading
    }
}

现在在你的第二个ViewController中,符合LoadingViewControllerDelegate并设置委托:

class SecondViewController: UIViewController, LoadingViewControllerDelegate {
    ...
    override func viewDidLoad() {
        loading.delegate = self
    }
    ...
    // MARK: - LoadingViewControllerDelegate
    func didFinishLoading(controller: LoadingViewController) {
        controller.dismissViewControllerAnimated(true, completion: nil)
    }
}

在你的Alamofire电话中,完成后运行以下内容:

loading.finished()