如何从视图调用 NSViewRepresentable 上的方法?

Rai*_*sen 3 macos swiftui

我很难理解 NSViewRepresentable 如何与 SwiftUI 视图交互。

例如,在下面的示例中,如何在单击视图中的按钮时加载不同的 URL?

import Cocoa
import SwiftUI
import WebKit
import PlaygroundSupport

struct InternalBrowser: NSViewRepresentable {
    func makeNSView(context: Context) -> WKWebView {
        let browser = WKWebView()
        browser.load(URLRequest(url: URL(string: "https://www.google.com")!))
        return browser
    }
    func updateNSView(_ nsView: WKWebView, context: Context) {
    }
}

struct Browser: View {
    var body: some View {
        GeometryReader { g in
            VStack {
                InternalBrowser().frame(width: 400, height: 400)
                Button(action: {
                    // how to tell InternalBrowser to load an URL here?
                }) {
                    Text("Load Different URL")
                }
            }
        }
    }
}

PlaygroundPage.current.setLiveView(Browser().frame(width: 500, height: 500))
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 5

单击视图中的按钮时如何加载不同的 URL?

这是可能方法的演示。使用 Xcode 11.4 / iOS 13.4 进行测试

struct InternalBrowser: NSViewRepresentable {
    @Binding var url: URL?

    func makeNSView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateNSView(_ browser: WKWebView, context: Context) {
        if let url = self.url, url != browser.url {
            browser.load(URLRequest(url: url))
        }
    }
}

struct Browser: View {
    @State var resourceURL = URL(string: "https://www.google.com")
    var body: some View {
        VStack {
            Button(action: {
                self.resourceURL = URL(string: "https://www.stackoverflow.com")
            }) {
                Text("Load Different URL")
            }
            Divider()
            InternalBrowser(url: self.$resourceURL).frame(width: 400, height: 400)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)