【问题标题】:Sheet and alert keeps refreshing my page for WKWebView SwiftUI工作表和警报不断刷新我的 WKWebView SwiftUI 页面
【发布时间】:2021-03-27 04:28:51
【问题描述】:

我目前正在使用 WKWebView,并在我的 wkwebview 中添加了一个工作表和一个警报。但是,每次我关闭工作表或关闭警报时,My WkWebView 都会继续导航(加载)回我指定的原始域(对于这种情况,google.com)。我想知道如何解决这个问题。

网页视图

import SwiftUI
import WebKit

struct WebView : UIViewRepresentable {
    
    let request: URLRequest
    
    func makeUIView(context: Context) -> WKWebView  {
        return WKWebView()
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.load(request)
    }
    
}

主视图

struct MainView: View {
   var webView: WebView = WebView(request: URLRequest(url: URL(string: "https://www.google.com")!))

 var body: some View {
  VStack(){
   AlertView()
   webView
   SheetScreenView(webView: $webView)
  }
 }

AlertView()

...
  Button(action: {
  }, label: {}..alert(isPresented: $isBookmarked) {
                Alert(title: Text(" \(webView.getURL())"), dismissButton: .default(Text("Ok")))
            }
...

SheetScreenView

....
@State private var showingSheet = false

    var body: some View {
        Button("Show Sheet") {
            showingSheet.toggle()
        }
        .sheet(isPresented: $showingSheet) {
            SheetView()
        }
    }
...

工作表视图

struct SheetView: View {
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        Button("Press to dismiss") {
            presentationMode.wrappedValue.dismiss()
        }
        .font(.title)
        .padding()
        .background(Color.black)
    }
}

【问题讨论】:

    标签: swift swiftui wkwebview


    【解决方案1】:

    即使没有工作表和警报,也可以通过旋转设备来重现您的问题。问题是在updateView(会经常被调用)中,你在URLRequest 上调用load。由于您将视图存储在 var 中,这将变得更加复杂,因为 SwiftUI 中的 Views 是瞬态的,所以每次新渲染 MainView 时都会重新创建该视图。

    避免这种情况的最简单方法如果您的 URL 不会更改,只需在 makeUIView 中调用 load

    struct WebView : UIViewRepresentable {
        var request: URLRequest
        
        func makeUIView(context: Context) -> WKWebView  {
            let webView = WKWebView()
            webView.load(request)
            return webView
        }
        
        func updateUIView(_ uiView: WKWebView, context: Context) {
            
        }
    }
    
    struct ContentView: View {
        var body: some View {
          WebView(request: URLRequest(url:URL(string: "https://www.google.com")!))
        }
    }
    
    

    如果您的网址可能发生变化,您需要一种方法来比较之前的状态和新的状态。这似乎是执行此操作的最短(但肯定不仅仅是)方法:

    struct WebView : UIViewRepresentable {
        var url: URL
        
        @State private var prevURL : URL?
        
        func makeUIView(context: Context) -> WKWebView  {
            return WKWebView()
        }
        
        func updateUIView(_ uiView: WKWebView, context: Context) {
            if (prevURL != url) {
                let request = URLRequest(url: url)
                uiView.load(request)
                DispatchQueue.main.async { prevURL = url }
            }
        }
    }
    
    struct ContentView: View {
        var body: some View {
            WebView(url: URL(string: "https://www.google.com")!)
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多