UIDocumentPickerDelegate 方法(didPickDocumentsAt)不被 iOS 调用

use*_*782 5 ios swift uidocumentpickervc uidocumentpickerviewcontroller

我有一个关于没有为 DocumentPickerViewController 调用委托方法的查询,这是背景,我只需要从我的文件应用程序中导入可用的资源,因此我使用 UIDocumentPickerViewController。

我有一个单独的 ViewController,我将 documentPickerViewController 的视图添加为子视图并添加它的委托。我的 ViewController 的代码是这样的。

var documentPickerController: UIDocumentPickerViewController!
  let supportedUTI = [kUTTypeImage,kUTTypeSpreadsheet,kUTTypePresentation,kUTTypeDatabase,kUTTypeFolder,kUTTypeZipArchive,kUTTypeVideo, kUTTypeAudiovisualContent]

documentPickerController = UIDocumentPickerViewController.init(documentTypes: supportedUTI as [String], in: .import)
    documentPickerController.delegate = self
    documentPickerController.allowsMultipleSelection = false
    view.addSubview(documentPickerController.view)
Run Code Online (Sandbox Code Playgroud)

现在,当我看到 pickercontroller 已打开,当我点击 Cancel 时会documentPickerWasCancelled被调用,但是当我选择一个文件时documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]不会被调用。

我试图进一步深入了解我所看到的内容,而不是显示我的 ViewController,如果我像这样直接显示 pickerViewController,我会将选择器的视图添加为子视图

UIDocumentPickerViewController *dc = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:[self UTITypes] inMode:UIDocumentPickerModeImport];
    dc.delegate = self;
    [MainVC presentViewController:dc animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

两个委托方法都被调用得很好。我不明白为什么。有人可以在这里帮助我吗!!提前致谢!!

Tom*_*mte -1

答案很简单:这是从 UIViewController 继承的。如果您只是将 viewController 的视图添加到您的视图中,则不会调用委托方法。ViewController 有自己的生命周期。请阅读此处:https ://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller

所以,对于某种错误表示歉意。当然,您可以添加一个仅显示其视图的子视图控制器。但是:我认为这不应该是用例。它是一个符合苹果本身设计指南的全屏ViewController。话虽如此,您应该将其呈现为:

func addPicker() {
    var documentPickerController: UIDocumentPickerViewController!

    documentPickerController = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .import)
    documentPickerController.delegate = self
    documentPickerController.allowsMultipleSelection = false

    present(documentPickerController, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

在提交的一些错误中,开发人员发现视图在调用委托之前被解除。据我所知,这种行为是在 ios11 中引入的,并且在呈现 viewController 时也会发生。我真的不能说这是否已修复,也不能说此行为是否与将其显示为子视图相关。(我认为它在某种程度上是固定的,因为它与呈现的 viewController 一起工作)

不管怎样,你应该按照上面写的那样呈现它,然后就可以开始了。

  • 但为什么取消的回调有效呢?如果我需要按照我想要的方式实施,你能建议我如何做到这一点吗?谢谢!! (4认同)