在后台加载View(及其WebView对象),然后执行Segue

时间:2014-07-30 10:28:49

标签: ios xcode uiwebview swift

我有一个导航控制器,通过segue管理两个Web视图。当有人单击第一个视图控制器中的特定链接时,该链接将在另一个Web视图中的第二个视图控制器中打开。因此,用户单击链接,对下一个视图执行segue并加载新页面。

我希望segue在执行segue之前等到第二个视图控制器中的网页加载到后台。

我尝试做类似这样的事情(作为viewDidLoad函数中的loadURL请求)但是(正如我所料)我得到一个错误(致命错误:无法解包Optional.None)因为webView没有还装!谁知道如何防止这种情况?

//code 
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if(segue.identifier == "second"){         
        segue.destinationViewController.load()
        segue.destinationViewController.viewDidLoad()            
    }
}

1 个答案:

答案 0 :(得分:0)

我会试试这个:

  • 在第一个视图控制器中创建虚拟webview((未将webview添加到主视图中)。
  • 在同一个第一个VC中,当用户点击该链接时,在虚拟webview上开始loadRequest
  • 然后在webViewDidFinishLoad(第一个VC)中致电performSegue
  • prepareForSegue中将虚拟webView添加到第二个视图控制器主视图(使用addSubView

我注意到webViewDidFinishLoadcalled multiple times,您必须添加一些代码才能真正知道加载何时完成(而不是多次调用prepareForSegue)。

这不是很简单,但希望它有所帮助。

编辑:

这是代码的一个(原始)示例,我测试了它并且它可以工作,但你必须调整一些东西(作为视图的尺寸和 finishLoad 的东西)(动作)按钮是openPage):

class DetailViewController: UIViewController, UIWebViewDelegate {

    var dummyWebViewInFirstVC: UIWebView = UIWebView(frame: CGRectMake(0, 0, 320, 480))
    var done = false

    @IBAction func openPage(sender: AnyObject) {


        let url = NSURL(string: "http://www.apple.com/")
        let request = NSURLRequest(URL: url)
        dummyWebViewInFirstVC.loadRequest(request)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        dummyWebViewInFirstVC.delegate = self
    }

    func webViewDidFinishLoad(theWebView: UIWebView) {

        if !done {
            self.performSegueWithIdentifier("openPage", sender: self)
            done = true;
        }
    }

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {

        let secondViewController : UIViewController = segue.destinationViewController as UIViewController
        secondViewController.view.addSubview(dummyWebViewInFirstVC)
    }
}