ios - 在转换到它之前加载 WebView
问题描述
我不得不更新一个我很长一段时间没有接触过的应用程序,现在在执行 webView.loadRequest(myRequest) 时在 DetailViewController::refreshWebView() 中面临一个“致命错误:在展开可选值时意外发现 nil”,因为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 中添加了一个标志,如果 webView 第一次被调用时为 nil,我可以在 viewDidLoad 中调用 refreshWebView。
解决方案
首先,您必须更新以下代码以进行 null 检查,这将防止您的应用程序崩溃。
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()
如果需要,该方法将在打开屏幕之前加载您的控件。
推荐阅读
- vb.net - 将 VBA SAPGUI 代码转换为 VB.NET 时遇到问题,找不到正确的导入库
- python - 尝试将输入字符串转换为浮点数时引发意外异常
- mongodb - 带有sails await 函数的多个聚合函数不会返回结果值
- mapbox-gl-js - 有没有办法动态设置地图弹出的高度?
- reactjs - 身份验证失败时重定向到登录
- javascript - 在代码沙箱内路由,由于 withRouter 而失败
- android - 无需将它们置于前台的应用程序间通信的最佳方法?
- reactjs - 从调度中获取响应 - React Redux
- sql - How to divide string by comma into new columns?
- excel - 尝试将表格的多个部分复制并粘贴到新的 word 文档中,不断在第一个单元格中粘贴新表格