我的 SwiftUI 应用程序中有一个 WKWebView 作为 UIViewRepresentable ,它最初可以工作。网页已加载,我可以导航到其他页面。如果我强制网络视图加载另一个页面,则什么也不会发生。它适用于 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()
}
}
Run Code Online (Sandbox Code Playgroud)
WebView 是这样使用的(简化示例):
var body: some View {
VStack{
Button(action: {
self.webView.reload()
}){
Text("reload")
}
webView
}
}
Run Code Online (Sandbox Code Playgroud)
事情有点复杂。重新加载是由操作表触发的,似乎也存在问题。请参阅我的带有操作表的简化示例:
@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()])
}
}
Run Code Online (Sandbox Code Playgroud)
您尝试将基于“参考”的方法应用于基于值的 SwiftUI 视图。这是不允许的,所以不起作用。在您的使用代码中webView在按钮操作和下面的
所以这是可能的方法。使用 Xcode 11.4 / iOS 13.4 进行测试

struct TestWebView: View {
@State private var shouldRefresh = false
var body: some View {
VStack{
Button(action: {
self.shouldRefresh = true
}){
Text("Reload")
}
WebView(url: nil, reload: $shouldRefresh)
}
}
}
struct WebView: UIViewRepresentable{
var url: URL? // optional, if absent, one of below search servers used
@Binding var reload: Bool
private let urls = [URL(string: "https://google.com/")!, URL(string: "https://bing.com")!]
private let webview = WKWebView()
fileprivate func loadRequest(in webView: WKWebView) {
if let url = url {
webView.load(URLRequest(url: url))
} else {
let index = Int(Date().timeIntervalSince1970) % 2
webView.load(URLRequest(url: urls[index]))
}
}
func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
loadRequest(in: webview)
return webview
}
func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {
if reload {
loadRequest(in: uiView)
DispatchQueue.main.async {
self.reload = false // must be async
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5801 次 |
| 最近记录: |