簡體   English   中英

ios:如何從協調器類 SwiftUi 重新加載 webview

[英]ios: How to reload webview from a Coordinator class SwiftUi

我正在制作一個包含多個網絡視圖的應用程序。 我想在從網頁發送 JS 命令並在如下所示的“func processReturnedJS(body: String)”中從協調器類重新加載我的 web 視圖。 我想知道如何以簡單的方式實現這一目標?

謝謝

訂閱視圖控制器:

import SwiftUI
import WebKit

struct SubscriptionViewController: UIViewRepresentable {
    @StateObject var storeManager: StoreManager
    
    let frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
    let config = WKWebViewConfiguration()
    let cookies = HTTPCookieStorage.shared.cookies ?? []
    
    func makeUIView(context: UIViewRepresentableContext<SubscriptionViewController>) -> WKWebView {
        for cookie in cookies {
            config.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
        }
        
        let preferences = WKPreferences()
        
        let configuration = WKWebViewConfiguration()
        configuration.preferences = preferences
        
        let userContentController = WKUserContentController()
        
        userContentController.add(context.coordinator, name:"observer")
        
        configuration.userContentController = userContentController
        
        
        let view = WKWebView(frame: frame, configuration: configuration)
        view.navigationDelegate = context.coordinator
        
        DispatchQueue.main.async {
            let url = URL(string:"theurl")!
            let request = URLRequest(url: url)
            for cookie in cookies {
                config.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
                view.configuration.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
            }
            
            view.load(request)
        }
        
        return view
    }
    
    func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<SubscriptionViewController>) {

    }
    
    func makeCoordinator() -> CoordinatorSubscription {
        CoordinatorSubscription(self, storeManage: self.storeManager)
    }
    
    typealias UIViewType = WKWebView
}


class CoordinatorSubscription: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
    
    var control: SubscriptionViewController
    var storeManage: StoreManager

    init(_ control: SubscriptionViewController, storeManage: StoreManager) {
        self.control = control
        self.storeManage = storeManage
    }
    
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        processReturnedJS(body: message.body as! String)
    }
    
    func sendjs(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    }
    
    
    
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }

    
    
    func processReturnedJS(body: String) {
    
        print("kkkk")
        
        //want to reload webview from here
            

    }
}

您可以在協調器中存儲對WKWebView的引用:

class CoordinatorSubscription: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
    
    var control: SubscriptionViewController
    var storeManage: StoreManager
    var webView : WKWebView? //<-- Here

    init(_ control: SubscriptionViewController, storeManage: StoreManager) {
        self.control = control
        self.storeManage = storeManage
    }
    
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        processReturnedJS(body: message.body as! String)
    }
    
    func sendjs(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    }
    
    
    
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }

    
    
    func processReturnedJS(body: String) {
    
        self.webView?.reload() //here

    }
}

然后,確保在makeUIView設置該屬性:

func makeUIView(context: UIViewRepresentableContext<SubscriptionViewController>) -> WKWebView {
    for cookie in cookies {
        config.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
    }
    
    let preferences = WKPreferences()
    
    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences
    
    let userContentController = WKUserContentController()
    
    userContentController.add(context.coordinator, name:"observer")
    
    configuration.userContentController = userContentController
    
    
    let view = WKWebView(frame: frame, configuration: configuration)
    view.navigationDelegate = context.coordinator
    
    DispatchQueue.main.async {
        let url = URL(string:"theurl")!
        let request = URLRequest(url: url)
        for cookie in cookies {
            config.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
            view.configuration.websiteDataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
        }
        
        view.load(request)
    }
    
    context.coordinator.webView = view //<-- Here
    
    return view
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM