带有多个按钮的WebView可在同一页面中浏览文件

时间:2015-11-10 14:27:33

标签: xcode swift macos uiwebview

我正在使用Swift和WebView处理OSX应用程序。 WebView包含2个用于浏览文件的HTML按钮:第一个仅允许图像,而第二个允许选择多个文件。

问题是我在调用webview委托方法runOpenPanelForFileButtonWithResultListener时无法知道触发了哪个按钮。

我想有类似的东西:

func webView(sender: WebView!, runOpenPanelForFileButtonWithResultListener resultListener: WebOpenPanelResultListener!, allowMultipleFiles: Bool) {

    let openDialog = NSOpenPanel()

    if button1 {
        openDialog.allowedFileTypes = [kUTTypeImage as String]
    }

    if button2 {
        openDialog.allowsMultipleSelection = true
    }

    // Other stuffs
}

1 个答案:

答案 0 :(得分:0)

我终于通过从Javascript调用Swift函数找到了实现此目的的方法 This blog post解释了这种沟通的工作原理。

当用户点击“浏览按钮”时,我会抓住该事件并将该按钮的名称从Javascript发送到WebView:

$(document).on('click', '#MyButtonName', function () {
    if (navigator.userAgent === "MyWebView") {
        webView.setClickedButton("MyButtonName");
    }
});

然后在Swift:

// Get Javascript key
func webView(webView: WebView!, didClearWindowObject windowObject: WebScriptObject!, forFrame frame: WebFrame!) {
    windowObject.setValue(self, forKey: "webView")
}

// Call Swift selector
override class func webScriptNameForSelector(aSelector: Selector) -> String! {
    if aSelector == "setClickedButton:" {
        return "setClickedButton"
    }
    else {
        return nil
    }
}

// Allow selector
override class func isSelectorExcludedFromWebScript(aSelector: Selector) -> Bool {
    return false
}

// Set the current clicked button from Javascript
func setClickedButton(btnName:String) {
    self.htmlClickedButton = btnName
}

现在我可以在我的委托方法中获得点击按钮:

if (self.htmlClickedButton == "MyButtonName") {
    openDialog.allowedFileTypes = [kUTTypeImage as String]
}

我不确定这个解决方案,它有效,但它看起来不是实现我的问题的最佳方式。
所以我打开这个主题以获得更好的建议。