Загрузите WebView перед переходом на него - PullRequest
0 голосов
/ 21 марта 2020

Мне пришлось обновить приложение, к которому я давно не прикасался, и теперь сталкиваюсь с «Фатальной ошибкой: неожиданно обнаружил ноль при развертывании необязательного значения» в DetailViewController :: refreshWebView () при выполнении webView.loadRequest ( myRequest), поскольку в данный момент 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)})
}
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 флаг, который позволяет мне вызвать refreshWebView в viewDidLoad, если webView равнялся нулю при первом вызове.

1 Ответ

1 голос
/ 21 марта 2020

Сначала необходимо обновить следующий код для проверки на ноль, что предотвратит сбой вашего приложения.

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() метод загрузит ваши элементы управления перед открытием экрана, если требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...