在 macOS 原生应用程序中通过 SwiftUI WKWebView 调用文件打开对话框时,需要进行以下步骤来确保其正常工作:
import SwiftUI
import WebKit
struct ContentView: View {
@ObservedObject var viewModel: WebViewViewModel
var body: some View {
NavigationView {
WebViewContainer(viewModel: viewModel)
.navigationBarTitle("Web View")
}
}
}
struct WebViewContainer: NSViewRepresentable {
let viewModel: WebViewViewModel
func makeNSView(context: Context) -> WKWebView {
let webView = WKWebView()
webView.navigationDelegate = context.coordinator
return webView
}
func updateNSView(_ nsView: WKWebView, context: Context) {
guard let url = viewModel.url else { return }
let request = URLRequest(url: url)
nsView.load(request)
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
class Coordinator: NSObject, WKNavigationDelegate {
// Implement WKNavigationDelegate methods here if needed
}
}
class WebViewViewModel: ObservableObject {
@Published var url: URL?
init(url: URL) {
self.url = url
}
}
applicationDidFinishLaunching
方法中,添加以下代码:func applicationDidFinishLaunching(_ aNotification: Notification) {
let manager = FileManager.default
let documentsFolder = manager.urls(for: .documentDirectory, in: .userDomainMask).first!
let options: [AnyHashable: Any] = [
kUTTypePDF: [kUTTypeURL: documentsFolder]
]
NSWorkspace.shared.registeredURLSchemes.append(options)
}
allowsMultipleSelection
属性为 false。例如,将以下代码添加到 WebViewViewModel 中:func openFile() {
let openPanel = NSOpenPanel()
openPanel.allowsMultipleSelection = false
openPanel.allowedFileTypes = ["pdf", "doc", "txt"] // 允许的文件类型
openPanel.begin { response in
if response == .OK, let url = openPanel.url {
self.url = url
}
}
}
这样,通过在 SwiftUI 视图中调用 webViewViewModel.openFile()
方法,即可弹出文件打开对话框,并将所选文件的 URL 设置给 WebView。
请注意,以上代码示例中的文件类型以及权限设置是为了演示目的,您可以根据自己的实际需求进行调整。另外,您可以使用 WKUIDelegate
来自定义文件选择对话框的外观和行为。
在腾讯云相关产品和产品介绍链接地址方面,由于要求不能提及具体品牌商,建议您查阅腾讯云官方文档或进行相应的网络搜索来了解相关产品和解决方案。
领取专属 10元无门槛券
手把手带您无忧上云