首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS8: UIDocumentPickerViewController get NSData

iOS8: UIDocumentPickerViewController get NSData
EN

Stack Overflow用户
提问于 2014-08-27 06:39:46
回答 3查看 4.1K关注 0票数 3

我已经根据UIDocumentPickerViewController实现了文档,现在尝试在委托方法中从选中的文件中获取NSData,但是[[NSData alloc] initWithContentsOfURL:]返回0:

代码语言:javascript
复制
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url{
    NSData* documentData = [[NSData alloc] initWithContentsOfURL:url];
    //documentData is nil
    documentData = [[NSData alloc] initWithContentsOfFile:[url path]];
    //documentData is still nil :(
}

我使用的是Xcode6 beta6,iPhone模拟器,文档选择器模式是UIDocumentPickerModeImport。试图检索保存到iCloude驱动器的文档。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-27 12:00:54

问题是,实际上Page (*.pages)不是文件,而是文件夹。因此,当我尝试从文件夹路径获取NSData时,它返回零。

默认的Mail.app将文档附加为zip存档。

票数 2
EN

Stack Overflow用户

发布于 2016-04-26 18:59:47

在这里对iWork文件(.pages、.numbers、.key)的回答稍作阐述,这样其他人就不必再发现这个问题了。(这也适用于非iWork文件。)

如果要从iWork中提取iCloud文件,那么在获得有效的NSData对象之前,您需要考虑两个主要问题。( A)通过NSFileCoordinator对象(如@cescofry所述)和B的安全范围,iWork文件实际上是目录/包,而不是单个文件。您想要用于optionscoordinateReadingItemAtURL:参数是NSFileCoordinatorReadingForUploading。这将在单个文件中读取,就像您使用了0一样,但会自动将目录转换为zip文件。去掉添加的.zip,您将得到一个有效的页面/数字/主题文件。(它也是有效的。)

代码语言:javascript
复制
[url startAccessingSecurityScopedResource];
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init];
NSError *error;
__block NSData *fileData;

[coordinator coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingForUploading error:&error byAccessor:^(NSURL *newURL) {
   // File name for use in writing the file out later
   NSString *fileName = [newURL lastPathComponent];
   NSString *fileExtension = [newURL pathExtension];

   if([fileExtension isEqualToString:@"zip"]) {
     if([[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"pages"] ||
        [[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"numbers"] ||
        [[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"key"] ) {
       // Remove .zip if it is an iWork file
       fileExtension = [[newURL URLByDeletingPathExtension] pathExtension];
       fileName = [[newURL URLByDeletingPathExtension] lastPathComponent];
     }
   }

   NSError *fileConversionError;
   fileData = [NSData dataWithContentsOfURL:newURL options:NSDataReadingUncached error:&fileConversionError];

   // Do something with the file data here

}
[url stopAccessingSecurityScopedResource];

关于NSFileCoordinator选项的相关苹果文档在这里:参考文件/c/tdef/NSFile协调员

票数 8
EN

Stack Overflow用户

发布于 2014-12-11 11:35:46

需要通过文件协调器访问文档选择器的URL。此外,还需要在范围内查看url:

代码语言:javascript
复制
[url startAccessingSecurityScopedResource];

__block NSData *data

 NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init];
 NSError *error;
 [coordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
    data = [NSData dataWithContentsOfURL:url];
 }];

 [url stopAccessingSecurityScopedResource];

更多来自苹果文档

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25520453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档