如何阻止 SwiftUI 重新加载我通过 UIViewRepresentable 使用的 WKWebView 页面?

问题描述

我的代码设置了它从网页获取的导航栏标题,但是每次这都会导致整个 WKWebView 重新加载...页面非常重,因此消耗了大量时间。使用按钮设置标题时的行为相同。


struct TransitScreen: View,HandlerDelegate {

    var urlRequest: URLRequest
    @State var pageTitle = "Title 1"

    var body: some View {

        vstack {

            KSWebView(urlRequest: urlRequest,delegate: self) // WKWebView using UIViewRepresentable
             
            NavigationLink("Go",destination: Text("Some Data"))
                
            Button(action: {
               pageTitle = "replaced \(Date().toSeconds())"
            }){
               Text("Change title")
            }
            
        }.navigationBarTitle(Text(pageTitle))
        .edgesIgnoringSafeArea(.top)
    }


    func process(data: String){
        pageTitle = data
    }

}

有没有办法阻止这种情况发生?或其他更新 navigationBarTitle 的方法

解决方法

找到问题根源

// KSWebView.swift

 func updateUIView(_ uiView: WKWebView,context: Context) {
   uiView.load(urlRequest)
  }

改成


func makeUIView(context: Context) -> WKWebView {
        // TODO: Check this hacky code and find some replacement
        let headerHeight = CGFloat(100)
        let webViewHeight = UIScreen.main.bounds.height - headerHeight
        let webViewFrame = CGRect(x: 0,y: headerHeight,width: UIScreen.main.bounds.width,height: webViewHeight)

        let webView = WKWebView(frame: webViewFrame,configuration: config())
        webView.load(urlRequest)
        self.webView = webView
        return webView
    }

    func updateUIView(_ uiView: WKWebView,context: Context) {

    }

这会阻止视图在每次更新时加载请求。