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

Man*_*ina 5 macos file selector webview swift

我已经在Swift中创建了OSX应用程序,并使用Xcode 7将WebView嵌入其中。在WebView加载的网页上有一个文件选择器,它要求用户从用户的计算机浏览特定文件。我面临的问题是,当用户单击浏览按钮时,什么也不会发生。

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

我是新手,所以在这种情况下的帮助将不胜感激。

这是我的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 
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

pbo*_*dsk 6

我自己没有为此工作,但是从令人费解的点点滴滴看来,这似乎可以满足您的要求。

首先...我正在使用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)
     }
  }
Run Code Online (Sandbox Code Playgroud)

有趣的是webview.uiDelegate。这保证我们将遵守此处记录的WKUIDelegate协议。如它所说:

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

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

如果实现此方法,则保证将显示一个文件上传面板,并callback使用用户选择的结果调用此方法的方法。请记住,callback当用户按下时也要调用该方法cancel。

这是一个简单又肮脏的例子:

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 == NSApplication.ModalResponse.OK {
                if let url = openPanel.url {
                    completionHandler([url])
                }
            } else if result == NSApplication.ModalResponse.cancel {
                completionHandler(nil)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这会给您一些入门的信息。

奖金材料

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

如何从WKWebView上传文件

如何实现委托方法

如何在Swift中创建NSOpenPanel

对于iOS(@DarshanMothreja询问)

我尝试将一个简单的程序粘合在一起,以在iOS上执行相同的操作。希望对您有用@DarshanMothreja

HTML 将一个名为的文件index.html添加到Xcode项目。内容如下所示:

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)
     }
  }
Run Code Online (Sandbox Code Playgroud)

迅速

这里是 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 { }
Run Code Online (Sandbox Code Playgroud)

如果运行上述命令,则在单击“选择文件”按钮时会得到此结果,而无需添加任何委托方法。

图像选择器开始

希望能给您一些帮助。