Получение invokeUndefinedMethodFromWebScript для работы в Swift

if ((state.staff.members && state.staff.members.length < 5) || (state.staff.departments && state.staff.departments.length < 5)) {}

Предполагается, что вы хотите, чтобы условие проходило только тогда, когда установлено хотя бы одно из свойств.

Изменить: в ответ на ваш комментарий я тогда напишу его следующим образом

if ((state.staff.members && state.staff.members.length < 5) 
    || (state.staff.departments && state.staff.departments.length < 5)
    || state.staff.hasOwnProperty('members') === false
    || state.staff.hasOwnProperty('departments') === false
) {}
1
задан arun siara.cc 19 January 2019 в 06:21
поделиться

1 ответ

Вы нашли старую статью, написанную для древнего WebView macOS, а не для WKWebView.

Вы используете WKScriptMessageHandler для создания взаимодействия между JavaScript и Swift, когда используете WKWebView.

ViewController.swift:

import WebKit

class ViewController: NSViewController, WKUIDelegate {
    @IBOutlet weak var wkWebView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let url = Bundle.main.url(forResource: "index", withExtension: "html")! //Simplified for testing
        let request = URLRequest(url: url)
        wkWebView.configuration.preferences.javaScriptEnabled = true
        wkWebView.configuration.userContentController.add(self, name: "mySwiftMessage") //<-
        wkWebView.load(request)
    }

    //...
}

extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {
        case "mySwiftMessage":
            if let callbackName = message.body as? String {
                message.webView?.evaluateJavaScript("\(callbackName)('Hello From Swift');", completionHandler: nil)
            }
        default:
            break
        }
    }
}

index. Вам просто нужно создать его программно:

import WebKit

class ViewController: UIViewController, WKUIDelegate {

    var wkWebView: WKWebView! //<- NOT an IBOutlet

    override func viewDidLoad() {
        super.viewDidLoad()
        let webConfig = WKWebViewConfiguration()
        webConfig.preferences.javaScriptEnabled = true
        webConfig.userContentController.add(self, name: "mySwiftMessage")
        wkWebView = WKWebView(frame: self.view.bounds, configuration: webConfig)
        view.addSubview(wkWebView)
        //You may need to add some constraints...
        //And create a better `index.html` for iOS...
        let url = Bundle.main.url(forResource: "index", withExtension: "html")!
        let request = URLRequest(url: url)
        wkWebView.load(request)
    }

    //...
}
0
ответ дан OOPer 19 January 2019 в 06:21
поделиться