【问题标题】:Load WebView before transitioning to it在转换到它之前加载 WebView
【发布时间】:2020-03-21 13:02:04
【问题描述】:

在执行 webView.loadRequest( myRequest),因为此时 webView 为 nil。

我没有更改与如何加载 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)})
}
import UIKit

class DetailViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet weak var webView: UIWebView!

    var animationWaitDelegate: MasterViewController!
    var eventUrl: String! {
        didSet {
            self.refreshWebView()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.delegate = self
    }

    func refreshWebView() {
        let myURL = URL(string:eventUrl!)
        let myRequest = URLRequest(url: myURL!)
        webView.loadRequest(myRequest)
    }

    func webViewDidFinishLoad(_ webView: UIWebView) {
        animationWaitDelegate.transitionToDetail()
    }
}

extension DetailViewController: EventSelectionDelegate {
    func eventSelected(_ newEvent: String) {
        eventUrl = newEvent
    }
}

// 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 第一次被调用时为 nil,我可以在 viewDidLoad 中调用 refreshWebView。

【问题讨论】:

    标签: ios swift uiwebview


    【解决方案1】:

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

    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)
            }
        }
    }
    

    loadViewIfNeeded() 方法将根据需要在打开屏幕之前加载您的控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多