3

我有这个代码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“(空)”用户信息 = {NSUnderlyingError = 0x600000da9a10 {错误Domain=GSLibraryErrorDomain Code=7 "没有存储文件:///****" UserInfo={NSDescription=没有存储文件:///****}}}

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

沙盒设置,用户选择的文件设置为读/写

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

更新

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

4

2 回答 2

6

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

- (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 一起使用

于 2020-03-06T17:09:20.460 回答
1

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

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    // handle urls
}
于 2022-02-04T15:49:19.610 回答