Очевидно, что задержка вызвана временем, которое требуется для создания нового экземпляра WKWebView
, а не временем, которое требуется для загрузки документа HTML.Чтобы избежать этой задержки, я нашел способ повторно использовать веб-представление.
Сначала я удалил веб-представление из сцены раскадровки, чтобы новое веб-представление не создавалось при каждой загрузке представления.Я создал общий вид с именем container
, который соответствует размеру, который я хотел видеть в Интернете.
Затем я создал статическую переменную, чтобы сохранить указатель на веб-представление:
static var webView: WKWebView? = nil
В моем случае эта статическая переменная находится в классе с именем GameController
.
Затем я изменил код, чтобы проверить, равна ли статическая переменная webView
нулю.Если webView
равно nil, код создает новое веб-представление и устанавливает статическую переменную, указывающую на это веб-представление.Затем код программно добавляет веб-представление как подпредставление контейнера в сцене раскадровки.
Чтобы настроить раскадровку и написать этот код, я использовал объяснение на следующем веб-сайте:
http://www.onebigfunction.com/ios/2016/12/14/iOS-javascript-communication/
Основной код в контроллере вида для сценыкоторый использует веб-представление (WebViewController
в моем коде) выглядит следующим образом:
override func loadView() {
super.loadView()
if GameController.webView == nil {
var webFrame = self.container!.frame
webFrame.origin.x = 0
webFrame.origin.y = 0
let config = WKWebViewConfiguration()
webView = WKWebView(frame: webFrame,
configuration: config)
GameController.webView = webView
} else {
webView = GameController.webView
}
self.container!.addSubview(webView)
}
В моем случае я хотел отправить информацию из кода JavaScript в веб-представлении в код Swift в моем приложении, поэтомуМне пришлось больше работать с конфигурациями.Я также хотел, чтобы веб-представление было прозрачным, поэтому я добавил для этого заявление.
override func loadView() {
super.loadView()
if GameController.webView == nil {
var webFrame = self.container!.frame
webFrame.origin.x = 0
webFrame.origin.y = 0
let config = WKWebViewConfiguration()
config.userContentController.add(self, name: "scriptHandler")
webView = WKWebView(frame: webFrame,
configuration: config)
webView.isOpaque = false
GameController.webView = webView
} else {
webView = GameController.webView
webView.configuration.userContentController.removeScriptMessageHandler(
forName: "scriptHandler")
webView.configuration.userContentController.add(self,
name: "scriptHandler")
}
self.container!.addSubview(webView)
}
Первоначально я устанавливал обработчик сценария только при первом просмотре веб-страницы, но это не сработало.По-видимому, каждый раз при загрузке сцены создавался новый объект контроллера представления, поэтому старый обработчик сценариев не работал.Этот код удаляет обработчик сценария, который указывает на старый контроллер представления, и добавляет обработчик сценария, который указывает на новый контроллер представления.