Swift 5 - 选择文件后未调用 documentPicker

Swift 5 - documentPicker not called after a file was selected

我正在做一个 Swift 5 项目,我需要实现一个文档选择器,用户可以为它 select 处理一个音乐文件。文档选取器显示在界面中,但在 UI 中 selected 文档后未调用 documentPicker 函数。

ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack() {
            Button("Select files to sync") {
                ImportMenuController().selectFile()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

ImportMenuController.swift 调用者 ContentView.swift:

//  ImportMenuController.swift

import Foundation
import UIKit
import UniformTypeIdentifiers

class ImportMenuController: UIViewController {
    
    func selectFile() {
        let importMenu = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.mp3], asCopy: true)
        importMenu.delegate = self
        importMenu.allowsMultipleSelection = true
        importMenu.shouldShowFileExtensions = true
        
        DispatchQueue.main.async {
            self.getTopMostViewController()?.present(importMenu, animated: true, completion: nil)
        }
    }
    
    func getTopMostViewController() -> UIViewController? {
        var topMostViewController = UIApplication.shared.keyWindow?.rootViewController

        while let presentedViewController = topMostViewController?.presentedViewController {
            topMostViewController = presentedViewController
        }
        return topMostViewController
    }
}

extension ImportMenuController: UIDocumentPickerDelegate {

   func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL){
        print("documentPicker opened")
    }

   func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
       print("documentPickerWasCancelled opened")
    }

}

我尝试了调用 documentPicker 的不同方式,但不幸的是,我仍然无法到达 documentPicker 或 documentPickerWasCancelled 函数,因此 print 命令从未执行过。最后,我需要检索 selected 文件的 fileUrl 以进一步处理它。我做错了什么?

参考

Current Apple Developer Documentation

您需要保留 document-picker 委托(在本例中为 ImportMenuController 的实例)。

这为您解决了这个问题。

let importer = ImportMenuController()
var body: some View {
   ZStack() {
       Button("Select files to sync") {
           importer.selectFile()
       }
   }