Запуск / обновление Просмотр в userContentController - Функция - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь запустить второй вид с помощью WKWebview, нажав кнопку. Это тоже работает. Я получаю обратный вызов в функции userContentController. Как можно запустить новый вид в приложении из этой функции.

struct MyWebView: UIViewRepresentable {

    var webPageURL = "https://google.de"

    func updateUIView(_ uiView: WKWebView, context: Context) {
        let myURL = URL(string:webPageURL)
        let myRequest = URLRequest(url: myURL!)
        uiView.load(myRequest)
    }

    func makeUIView(context: Context) -> WKWebView {

        let webConfiguration = WKWebViewConfiguration()
        let wkcontentController = WKUserContentController()

        wkcontentController.add(context.coordinator, name: "doStuffMessageHandler")
        webConfiguration.userContentController = wkcontentController

        let webView = WKWebView(frame: .zero,configuration: webConfiguration)
        context.coordinator.parent = webView // inject as weak

        return webView
    }

    func makeCoordinator() -> ContentController {
         ContentController() // let handler be a coordinator
     }
}

class ContentController: NSObject, WKScriptMessageHandler {
    weak var parent: WKWebView? // weak to avoid reference cycling


     func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
     {
        if message.name == "doStuffMessageHandler"
        {

            print(message.body)

        }
    }
}

struct MyWebView_Previews: PreviewProvider {
    static var previews: some View {
        MyWebView()
    }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Возможным решением является использование уведомлений (что позволяет сохранять эти компоненты независимыми).

extension Notification.Name {
    static let didReceiveMessage = Notification.Name("didReceiveMessage")
}

class ContentController: NSObject, WKScriptMessageHandler {
    weak var parent: WKWebView? // weak to avoid reference cycling

     func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
     {
        if message.name == "doStuffMessageHandler"
        {
            NotificationCenter.default.post(name: .didReceiveMessage, object: message.body)
        }
    }
}

struct DemoHandleMessage: View {
    @State private var showMessage = false
    @State private var message: String? = nil
    var body: some View {
        VStack {
            if showMessage {
                 // switch back via bound flag to showMessage state
                MessageView(text: message, dismiss: $showMessage)
            } else {
                MyWebView()
            }
        }.onReceive(NotificationCenter.default.publisher(for: .didReceiveMessage)) { notification in
            self.message = notification.object as? String
            self.showMessage = true
        }
    }
}
...