官方文檔解析
官方文檔:https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller?language=objc
UIDocumentPickerViewController有四種模式:
- Import an external document:用戶選擇一個(gè)外部文檔悉罕,文檔選擇器拷貝該文檔到應(yīng)用沙盒赤屋,不會(huì)修改源文檔。
- Export a local document:文檔選擇器拷貝文檔到一個(gè)外部路徑壁袄,不會(huì)修改源文檔类早。
- Open an external document:打開一個(gè)外部文檔,用戶可以修改該文檔嗜逻。
- Move a local document:拷貝文檔到外部路徑涩僻,同時(shí)可以修改該拷貝。
操作外部文件注意事項(xiàng)
- open與move操作會(huì)提供外部文件的
security-scoped
URL 栈顷。調(diào)用startAccessingSecurityScopedResource
開始訪問逆日,訪問完成調(diào)用stopAccessingSecurityScopedResource
。 - 使用
NSFileCoordinator
來操作外部文件 - 使用
NSFilePresenter
來展示外部文件內(nèi)容 - 不要存儲(chǔ)
security-scoped
URL
調(diào)用Demo
展示文件選擇
- (void)presentDocumentPicker {
NSArray *types = @[]; // 可以選擇的文件類型
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeOpen];
documentPicker.delegate = self;
documentPicker.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:documentPicker animated:YES completion:nil];
}
用戶選擇文件回調(diào)
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
BOOL canAccessingResource = [url startAccessingSecurityScopedResource];
if(canAccessingResource) {
NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
NSError *error;
[fileCoordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
NSData *fileData = [NSData dataWithContentsOfURL:newURL];
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [arr lastObject];
NSString *desFileName = [documentPath stringByAppendingPathComponent:@"myFile"];
[fileData writeToFile:desFileName atomically:YES];
[self dismissViewControllerAnimated:YES completion:NULL];
}];
if (error) {
// error handing
}
} else {
// startAccessingSecurityScopedResource fail
}
[url stopAccessingSecurityScopedResource];
}
文件類型定義
initWithDocumentTypes:inMode:
中萄凤,types需要傳入一個(gè)uniform type identifiers (UTIs)數(shù)組室抽。關(guān)于UTIs的官方文檔,常見列表
歡迎關(guān)注我的博客