Ios 在转换到WebView之前加载WebView

Ios 在转换到WebView之前加载WebView,ios,swift,uiwebview,Ios,Swift,Uiwebview,我必须更新一个应用程序,我有一段时间没有接触它,现在面临一个“致命错误:在执行webView.loadRequest(myRequest)时,在DetailViewController::refreshWebView()中展开可选值时意外地发现了零”,因为此时webView为零 我没有更改任何与如何加载DetailViewController并将其分配给MasterViewController有关的内容,因此我很困惑为什么这不再有效 有什么我不知道的变化吗?还是我一开始就错误地实现了这整件事,而

我必须更新一个应用程序,我有一段时间没有接触它,现在面临一个“致命错误:在执行webView.loadRequest(myRequest)时,在DetailViewController::refreshWebView()中展开可选值时意外地发现了零”,因为此时webView为零

我没有更改任何与如何加载DetailViewController并将其分配给MasterViewController有关的内容,因此我很困惑为什么这不再有效

有什么我不知道的变化吗?还是我一开始就错误地实现了这整件事,而这一切都是巧合

import UIKit

protocol EventSelectionDelegate: class {
    func eventSelected(_ newEvent: String)
}

class MasterViewController: UIViewController, UIWebViewDelegate {

    var activityView: UIActivityIndicatorView!
    weak var delegate: EventSelectionDelegate?

    func detailChosen(_ detailUrlString: String) {
        delegate?.eventSelected(detailUrlString)
        activityView.startAnimating()
    }

    func transitionToDetail() {
        if let detailViewController = self.delegate as? DetailViewController {
            DispatchQueue.main.async {
                self.activityView.stopAnimating()
                self.splitViewController?.showDetailViewController(detailViewController, sender: nil)
            }
        }
    }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToUIApplicationOpenExternalURLOptionsKeyDictionary(_ input: [String: Any]) -> [UIApplication.OpenExternalURLOptionsKey: Any] {
    return Dictionary(uniqueKeysWithValues: input.map { key, value in (UIApplication.OpenExternalURLOptionsKey(rawValue: key), value)})
}

PS:在此期间,我找到了一个解决方法,在DetailViewController中添加了一个标志,允许我在webView第一次被调用时调用viewDidLoad中的refreshWebView。

首先,您必须更新以下代码以进行空值检查,这将防止应用程序崩溃

func refreshWebView() {
    if webView != nil {
         let myURL = URL(string:eventUrl!)
         let myRequest = URLRequest(url: myURL!)
         webView.loadRequest(myRequest)
    }
}
在转换后,添加以下代码将解决您的问题

func transitionToDetail() {
    if let detailViewController = self.delegate as? DetailViewController {
        DispatchQueue.main.async {
            self.activityView.stopAnimating()
            detailViewController.loadViewIfNeeded()   // Add this line of code
            self.splitViewController?.showDetailViewController(detailViewController, sender: nil)
        }
    }
}
LoadViewIfRequired()
方法将在打开屏幕之前加载控件(如果需要)

func transitionToDetail() {
    if let detailViewController = self.delegate as? DetailViewController {
        DispatchQueue.main.async {
            self.activityView.stopAnimating()
            detailViewController.loadViewIfNeeded()   // Add this line of code
            self.splitViewController?.showDetailViewController(detailViewController, sender: nil)
        }
    }
}