SwiftUI:WKWebView未加载

SwiftUI:WKWebView未加载,swiftui,Swiftui,在我的SwiftUI应用程序中,我有一个作为UIViewRepresentable的WKWebView,它最初可以工作。网页已加载,我可以导航到其他页面。如果我强制web视图加载另一个页面,则不会发生任何事情。它与Xcode 11.3一起工作,但似乎从11.4开始就坏了。 这里有一个例子。重新加载力以随机方式加载第1页或第2页。 有什么建议吗?有什么问题吗 import WebKit import SwiftUI struct WebView: UIViewRepresentable{

在我的SwiftUI应用程序中,我有一个作为UIViewRepresentable的WKWebView,它最初可以工作。网页已加载,我可以导航到其他页面。如果我强制web视图加载另一个页面,则不会发生任何事情。它与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()
    }

}
事情有点复杂。重新加载是由操作表触发的,似乎也存在问题。请参见我的简化示例和行动表:

@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()])
            }
        }

您尝试对基于值的SwiftUI视图应用“引用”基本方法。这是不允许的,所以不起作用。在您的用法中,按钮操作中的代码
webView
和下面的代码中有不同的独立值(因为webView是struct)

所以这里有一个可能的方法。使用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
            }
        }
    }
}

struct TestWebView:View{
@状态私有变量shouldRefresh=false
var body:一些观点{
VStack{
按钮(操作:{
self.shouldRefresh=true
}){
文本(“重新加载”)
}
WebView(url:nil,重载:$shouldRefresh)
}
}
}
结构WebView:UIViewRepresentable{
var url:url?//可选,如果不存在,则使用以下搜索服务器之一
@绑定变量重载:Bool
私有let URL=[URL(字符串:”https://google.com/“”),URL(字符串:https://bing.com")!]
私有let webview=WKWebView()
fileprivate func loadRequest(在webView:WKWebView中){
如果让url=url{
加载(url请求(url:url))
}否则{
让index=Int(Date().timeIntervalSince1970)%2
load(url请求(url:url[index]))
}
}
func makeUIView(上下文:UIViewRepresentableContext)->WKWebView{
loadRequest(在:webview中)
返回webview
}
func updateUIView(uiView:WKWebView,context:UIViewRepresentableContext){
如果重新加载{
loadRequest(在:uiView中)
DispatchQueue.main.async{
self.reload=false//必须是异步的
}
}
}
}

您是如何强制web view加载另一个页面、再次启动或使用某些事件的?我在嵌入web view的页面上显示了一个操作表。这里我调用重载函数。我想我明白了。。。它不在这里-你能展示一下你如何使用这个网络视图的代码吗?添加-谢谢你的提问抱歉-url是我最初实现时留下的。我添加了URL数组进行测试。问题是:webview.load(..)没有nothing@netshark1000,正如我所写的,发布的代码已经过测试并运行良好。我使用的是Xcode 11.4(11E146)。你的意思是当你多次加载请求并看到一次google和一次bing时,它真的会加载新内容吗?我假设您只调用此方法一次,并且不查看web视图是否真的加载了新url。谢谢!它适用于我的简化用法示例。但当我从行动表中触发它时,它不会。请看我的更新文章和行动表的例子。你用行动表测试过吗?如果我将上面的代码与操作表和新的WebView一起使用,则重新加载不起作用。
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
            }
        }
    }
}