如何修改SwiftUI中WKWebView的文件选择弹窗显示位置?
调整NSOpenPanel位置至WKWebView所在窗口中央
要让文件选择弹窗和Safari一样显示在WebView所在窗口的中央,核心是将NSOpenPanel作为目标窗口的sheet弹窗展示,而非默认的独立全局弹窗。修改你的runOpenPanelWith方法即可实现:
修改后的完整代码
public func webView(_ webView: WKWebView, runOpenPanelWith parameters: WKOpenPanelParameters, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping ([URL]?) -> Void) { let openPanel = NSOpenPanel() openPanel.prompt = String(localized: "Upload") openPanel.message = String(localized: "title") openPanel.canChooseFiles = true // 获取WebView所属的窗口 guard let targetWindow = webView.window else { // 窗口获取失败时降级为默认弹窗逻辑 openPanel.begin { result in completionHandler(result == .OK ? openPanel.url.map { [$0] } : nil) } return } // 以sheet形式在目标窗口中央展示弹窗 openPanel.beginSheetModal(for: targetWindow) { result in completionHandler(result == .OK ? openPanel.url.map { [$0] } : nil) } }
关键改动说明
- 绑定目标窗口:通过
webView.window获取WKWebView所在的NSWindow,这是弹窗定位到窗口中央的核心依据。 - 切换弹窗展示方式:用
beginSheetModal(for:completionHandler:)替代默认的begin()方法,该方法会将弹窗作为目标窗口的附属sheet,自动居中显示在窗口内部,和Safari的行为完全一致。 - 异常降级处理:增加窗口为空的判断逻辑,避免极端场景下的崩溃,此时仍保留原有的全局弹窗逻辑作为备选。
内容的提问来源于stack exchange,提问作者Чайка
相关产品推荐
相关产品推荐

