You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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,提问作者Чайка

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:37:07