【问题标题】:UIDocumentPickerViewController not calling didPickDocumentAtURL on Mac CatalystUIDocumentPickerViewController 没有在 Mac Catalyst 上调用 didPickDocumentAtURL
【发布时间】:2020-03-04 02:04:56
【问题描述】:

我在UIViewController 中有此代码,可确认UIDocumentPickerDelegate

- (void)openTextFilePicker {
    NSArray *UTIs = [NSArray arrayWithObjects:@"public.text", nil];
    [self openFilePicker:UTIs];
}

- (void)openFilePicker:(NSArray *)UTIs {
    UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:UTIs inMode:UIDocumentPickerModeImport];
    documentPicker.delegate = self;
    documentPicker.popoverPresentationController.barButtonItem = self.importButton;
    [self presentViewController:documentPicker animated:TRUE completion:nil];
}

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURLs:(NSArray<NSURL *> *)urls {
    [self documentPicker:controller didPickDocumentAtURL:[urls firstObject]];
}

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
    NSLog(@"picked document %@", url);
}

- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller {
    NSLog(@"cancelled");
}

这在 iOS 中运行良好。在 Mac Catalyst 中,文件选择器打开,我可以导航并选择一个文件,但是当我单击选择器中的打开按钮时,既不会调用 didPickDocumentAtURLs 也不会调用 didPickDocumentAtURL。但是,如果我单击选择器中的取消按钮,则会调用 documentPickerWasCancelled

当我单击打开时,控制台中出现此错误:

未能将所选 URL 文件:///**** 的缩略图与 收件箱复制文件:///****:错误域=QLThumbnailErrorDomain 代码=102 “(空)” UserInfo={NSUnderlyingError=0x600000da9a10 {错误 Domain=GSLibraryErrorDomain Code=7 "没有存储文件:///****" UserInfo={NSDescription=no storage for file:///****}}}

我认为这可能意味着我的沙盒安全设置有问题,但是当我将选择器模式更改为 UIDocumentPickerModeOpen 时,该错误不再发生,但仍然没有调用 didPickDocumentAtURL。无论如何,这是我的沙盒设置:

我已经看到有关文档选择器打开空白的帖子,但这不是问题所在。我只看到一篇似乎证实它确实有效的帖子,但那是使用 Swift ......它是否可以在 Swift 中工作但在 Objective C 中被破坏?我还缺少其他东西来完成这项工作吗?

更新

这里是a new Xcode project,其中包含演示问题的最少代码。与我的完整项目一样,这在 iOS 上运行良好,但在 Mac 上不调用 didPickDocument... 委托方法。

【问题讨论】:

    标签: ios objective-c mac-catalyst uidocumentpickerviewcontroller


    【解决方案1】:

    据我所知,您刚刚在方法签名中打错字,正确的是

    - (void)documentPicker:(UIDocumentPickerViewController *)controller 
    didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls {
        NSLog(@"picked URLs %@", urls);
        // selecting multiple documents is cool, but requires iOS 11
        [self documentPicker:controller didPickDocumentAtURL:[urls firstObject]];
    }
    

    在 iOS 上有效,因为仍然支持已弃用的旧版

    - (void)documentPicker:(UIDocumentPickerViewController *)controller 
      didPickDocumentAtURL:(NSURL *)url; 
    

    但是 macOS/Catalyst 没有,所以你的委托只是因为缺少方法而没有被调用。

    经过测试并适用于 Xcode 11.2

    【讨论】:

    • 天哪,你是对的!我在新方法名称中使用了“URL”复数形式,但没有使用“Document”。感谢您发现错误并确认解决方案。当该选项可用时,我将奖励赏金。
    【解决方案2】:

    适用于 Catalyst 的新 API 的 Swift 版本是:

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        // handle urls
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多