我自己没有处理过这个,但是从令人费解的点点滴滴看来,这似乎可以满足您的需求。
首先...我使用的是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 方法,并返回用户选择的结果。 记住在用户按下cancel时也要调用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 == NSApplication.ModalResponse.OK {
if let url = openPanel.url {
completionHandler([url])
}
} else if result == NSApplication.ModalResponse.cancel {
completionHandler(nil)
}
}
}
}
希望这能给你一些入门的东西。
奖励材料
以下是一些对我有帮助的链接:
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 项目中。内容如下:
<!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>
斯威夫特
这里是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 { }
如果我运行上面的,当我点击“选择文件”按钮时,我会得到这个结果,不需要添加任何委托方法。
希望能给你一些工作。