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

标签 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 
}

谢谢。

最佳答案

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

首先...我正在使用 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。这 promise 我们将遵守 WKUIDelegate 协议(protocol) documented here .正如它所说:

The WKUIDelegate class provides methods for presenting native user interface elements on behalf of a webpage.

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

如果您实现此方法,您 promise 您将显示一个文件上传面板,并使用用户选择的结果调用此方法的 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)
            }
        }
    }
}

希望这能给您一些入门知识。

奖励 Material

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

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>

swift

这是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 { }

如果我运行上面的代码,当我点击“选择文件”按钮时我会得到这个结果,不需要添加任何委托(delegate)方法。

Image picker is go

希望这能给你一些有用的东西。

关于swift - 输入类型=文件在 OS X 应用程序的 WebView 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42947692/

相关文章:

os x更新后Mysql表名小写

arrays - 将 firebase 中多个字典中的值添加到 Int 中

swift - 无法使用类型的参数列表调用类型 'MKPlacemark' 的初始值设定项

arrays - 如何快速卡住数组?

swift - 如何向停靠栏中的应用程序添加菜单?

ruby - gem 在 OSX 10.15 上安装 therubyracer -v 0.12.3

java - 静态加载 .txt 文件

c# - GDI+ 中发生一般性错误(屏幕截图 SaveAsFile、ExternalException)

macos - 批量删除文件扩展名 OSX

ios - 无法为本地推送连接配置 NEAppPushManager