我正在使用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
}
答案 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]
}
我不确定这个解决方案,它有效,但它看起来不是实现我的问题的最佳方式。
所以我打开这个主题以获得更好的建议。