У меня есть WKWebView как UIViewRepresentable в моем приложении SwiftUI, и он работает изначально. Веб-страница загружена, и я могу перейти на другие страницы. Если я заставлю веб-представление загрузить другую страницу, ничего не произойдет. Он работал с Xcode 11.3, но, похоже, не работает с 11.4. Вот пример. Перезагрузите силы, чтобы загрузить страницу 1 или 2 случайно. Любое предложение, в чем может быть проблема?
import WebKit
import SwiftUI
struct WebView: UIViewRepresentable{
var url: URL
let urls = [URL(string: "https://google.com/")!, URL(string: "https://bing.com")!]
private let webview = WKWebView()
fileprivate func loadRequest() {
let index = Int(Date().timeIntervalSince1970) % 2
print(index)
let request = URLRequest(url: urls[index])
webview.load(request)
}
func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
loadRequest()
return webview
}
func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {}
func reload(){
loadRequest()
}
}
WebView не используется таким образом (упрощенный пример):
var body: some View {
VStack{
Button(action: {
self.webView.reload()
}){
Text("reload")
}
webView
}
}
Все немного сложнее. Перезагрузка инициируется листом действий, и, похоже, также существует проблема. Пожалуйста, смотрите мой упрощенный пример с листом действий:
@State private var showingSheet = false
@State private var shouldRefresh = false
var body: some View {
ZStack{
WebView(url: url, reload: $shouldRefresh)
.padding(paddingEdgeInsets())
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
.edgesIgnoringSafeArea(.all)
Button(action: {
self.showingSheet = true
}){
Text("Show sheet")
}
}.actionSheet(isPresented: $showingSheet) {
ActionSheet(title: Text("OPTIONS"), buttons: [
.default(Text("RELOAD"), action: {
self.shouldRefresh = true
}), .default(Text("EXIT"), action: {
self.presentationMode.wrappedValue.dismiss()
}), .cancel()])
}
}