场景分析
情景:草稿箱
描述:从草稿箱再次进入编辑界面,继续选择图片时,保持上次图片的选择状态
问题提出:笔者的图片选择器是使用TZImagePickerController,如果弹出选择器时,要保持图片的选中状态,必须在弹出前传递上次已选中的Asset数组。那么如何保存Asset数组呢?
序列化PHAsset
通过序列化PHAsset的localIdentifier,最后通过PHAsset的类方法,即可获得PHAsset对象
+ (PHFetchResult<PHAsset *> *)fetchAssetsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
具体演示
一、获得图片ID
/// TZImagePicker的代理方法
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray<NSDictionary *> *)infos
{
_selectedAssets = [NSMutableArray arrayWithArray:assets];
for(NSInteger i = 0; i < infos.count; i++)
{
// asset.localIdentifier 为图片唯一ID
[self.selectedImagesId addObject:asset.localIdentifier];
}
}
二、将图片ID –> PHAsset
- (void)setSelectedImagesId:(NSMutableArray *)selectedImagesId
{
_selectedImagesId = selectedImagesId;
for (NSString *ID in self.selectedImagesId)
{
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[ID] options:nil];
[_selectedAssets addObject:fetchResult.firstObject];
}
}
三、传递selecteAsset
/// 显示图片选择控制器
- (void)showImagePickerCompletion:(void(^)())completion
{
TZImagePickerController *picker = [[TZImagePickerController alloc] initWithMaxImagesCount:maxPhotoCount delegate:self];
picker.allowPickingOriginalPhoto = NO;
picker.selectedAssets = _selectedAssets;
[self presentViewController:picker animated:YES completion:^{
if(completion)
completion();
}];
}