输入类型=文件在OS X应用程序的WebView中不起作用

时间:2017-03-22 09:39:12

标签: swift macos file webview selector

我在Swift中创建了一个OSX应用程序,并使用Xcode 7在其中嵌入了WebView。我在WebView加载的网页上有一个文件选择器,要求用户浏览用户的特定文件。电脑。我面临的问题是当用户点击浏览按钮时没有任何反应。

如果我在Safari中打开相同的网页,则相同的文件选择器控件正常工作。

我在swift中相对较新,所以在这种情况下的帮助将不胜感激。

这是我的viewDidLoad功能:

func viewDidLoad() {
    super.viewDidLoad() 
    let url=NSURL(string: "http://video.online-convert.com/convert-to-mp4")
    let request=NSURLRequest(URL:url!) 
    webView.frameLoadDelegate=self 
    webView.mainFrame.loadRequest(request)  
    webView.shouldCloseWithWindow = true 
    webView.drawsBackground = true 
}

感谢。

1 个答案:

答案 0 :(得分:2)

我自己并没有这方面的工作,但是从令人费解的点点滴滴开始,这似乎就是你喜欢的。

首先......我正在使用WKWebView。这是使用本地HTML文件声明和初始化的,如下所示:

import Cocoa
import WebKit

class ViewController: NSViewController {

    let webview: WKWebView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()
        webview.autoresizingMask = [.viewWidthSizable, .viewHeightSizable]
        webview.frame = view.bounds
        webview.uiDelegate = self
        view.addSubview(webview)

        let fileURL = URL(fileURLWithPath: "/Users/myuserhere/Desktop/index.html")
        webview.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
     }
  }

有趣的部分是webview.uiDelegate。这承诺我们将遵守WKUIDelegate协议documented here。正如它所说:

  

WKUIDelegate类提供代表网页呈现本机用户界面元素的方法。

您可以实施的方法之一是runOpenPanelWithParameters:

如果您实施此方法,则承诺您将提供文件上传面板,并使用用户选择的结果调用此方法的callback方法。

这是一个快速而又肮脏的例子:

extension ViewController: WKUIDelegate {
    func webView(_ webView: WKWebView, runOpenPanelWith parameters: WKOpenPanelParameters, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping ([URL]?) -> Void) {
        let openPanel = NSOpenPanel()
        openPanel.canChooseFiles = true
        openPanel.begin { (result) in
            if result == NSFileHandlingPanelOKButton {
                if let url = openPanel.url {
                    completionHandler([url])
                }
            }
        }
    }
}

希望这能为您提供一些入门机会。

奖金材料

以下是一些帮助我的链接:

How to upload files from WKWebView

How to implement the delegate method

How to create a NSOpenPanel in Swift

对于iOS(由@DarshanMothreja提问)

我尝试将一个简单的程序粘合在一起,在iOS上做同样的事情。我希望它对你有用@DarshanMothreja

<强> HTML 名为index.html的文件被添加到Xcode项目中。内容如下所示:

&#13;
&#13;
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <label for="file">File goes here</label>
    <input type="file" name="file" value="File">
  </body>
</html>
&#13;
&#13;
&#13;

<强> 夫特

以下是ViewController

import UIKit
import WebKit

class ViewController: UIViewController {
    let webview: WKWebView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()
        webview.autoresizingMask = [ .flexibleWidth, .flexibleHeight ]
        webview.frame = view.bounds
        webview.uiDelegate = self
        view.addSubview(webview)   

        if let path = Bundle.main.path(forResource: "index", ofType: "html") {
            let fileURL = URL(fileURLWithPath: path)
            webview.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
        }
    }
}

extension ViewController: WKUIDelegate { }

如果我运行上述操作,当我点击&#34;选择文件&#34;按钮,无需添加任何委托方法。

Image picker is go

希望能为你提供一些工作。