【问题标题】:Load a View (and it's WebView object) in the Background and then performing the Segue在后台加载视图(及其 WebView 对象),然后执行 Segue
【发布时间】:2014-09-21 23:00:34
【问题描述】:

我有一个导航控制器,它通过一个 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()            
    }
}

【问题讨论】:

    标签: ios xcode uiwebview swift


    【解决方案1】:

    我会试试这个:

    • 在第一个视图控制器中创建一个虚拟 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)
        }
    }
    

    【讨论】:

    • 但是使用 let NextView = secondViewController() NextView.secondWebView = tempWebView 不起作用..有没有办法将加载的 webView 传递给另一个 UIView?
    • 使用:secondViewController.view.addSubview(dummyWebViewOfFirstVC)
    • 我收到致命错误:Can't unwrap Optional.None by doing that.. (因为当然没有加载另一个视图!有没有办法防止这种情况发生?)
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2012-09-14
    • 2018-12-18
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多