96427


`SwiftUI`で`WKWebView`を表示し、任意のページを表示することは出来ました。しかし、ページ内の「（アップロード）ファイルを選択」をクリックすると、

  * ファイルダイアログが、WebViewの中心ではなく、スクリーンの中心に表示されます
  * 確定ボタンが`Safari`ではUploadと表示されますが、Openと表示されます

この２点を修正するには、コードをどの様に修正したら良いのでしょうか？ご存じの方、お教え下さい。  
ファイルダイアログの位置については、`frame: WKFrameInfo`をいじれば良いような気がしますがまだ暗中模索状態です。

`WKUIDelegate`の`open`デリゲートは以下のように書いています

[code]

    public 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)
            }
        }
    }
    
[/code]

  * 追記、ボタンをUploadにすることは、`openPanel = NSOpenPanel()`でインスタンスを生成した後、`openPanel.prompt = "Upload"`で出来ました。残る問題はダイアログの位置の調整だけになりました。


CC BY-SA 4.0
2023-10-03T23:43:58.940
96417
2023-10-05T11:44:28.387
2023-10-04T00:32:02.493
14745
14745
question
macos swiftui webkit
WebKitのファイルオープン（アップロード）パネルのカスタマイズ


`OpenPanel`を`.begin`で使うのではなく、`.beginSheetModal`で使う事で解決しました。修正したコードは以下のようになります。

[code]

    public func webView(_ webView: WKWebView, runOpenPanelWith parameters: WKOpenPanelParameters, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping ([URL]?) -> Void) {
        func handleResult(_ result: NSApplication.ModalResponse) {
            if result == NSApplication.ModalResponse.OK, let url = openPanel.url {
                completionHandler([url])
            } else {
                completionHandler(nil)
            }
        }
        
        let openPanel = NSOpenPanel()
        openPanel.prompt = String(localized: "Upload")
        openPanel.message = String(localized: "title")
        openPanel.canChooseFiles = true
        if let window = webView.window {
            openPanel.beginSheetModal(for: window, completionHandler: handleResult)
        } else { // web view is somehow not in a window? Fall back to begin
            openPanel.begin(completionHandler: handleResult)
        }
    }
    
[/code]


CC BY-SA 4.0
2023-10-05T09:15:22.983
96427
2023-10-05T11:44:28.387
2023-10-05T11:44:28.387
14745
14745
96417
answer