[PHCollectionList canContainCustomKeyAssets]:无法识别的选择器发送到实例

3

我在最新的iOS版本(iOS 9.2和iOS 9.3)上获取PHAssets时出现了崩溃。它以前可以正常工作。

我收到的错误信息是:

[PHCollectionList canContainCustomKeyAssets]: unrecognized selector sent to instance Terminating app due to uncaught exception 'NSInvalidArgumentException'

抛出异常的代码行是:

            PHFetchResult *fetchImage = [PHAsset fetchKeyAssetsInAssetCollection:(PHAssetCollection*)collection options:fetchOptions];

这里提供更多的代码,以供参考:

Class PHPhotoLibrary_class = NSClassFromString(@"PHPhotoLibrary");
        if (PHPhotoLibrary_class) {

            PHFetchResult *fetchResult = self.collectionsFetchResults[indexPath.section];
            PHCollection *collection = fetchResult[indexPath.row];

            cell.textLabel.text = collection.localizedTitle;

            PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
            fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
            PHFetchResult *fetchImage = [PHAsset fetchKeyAssetsInAssetCollection:(PHAssetCollection*)collection options:fetchOptions];
            PHAsset *asset = [fetchImage firstObject];

            PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
            options.resizeMode = PHImageRequestOptionsResizeModeExact;

            CGFloat scale = [UIScreen mainScreen].scale;
            CGFloat dimension = 90.0;
            CGSize size = CGSizeMake(dimension*scale, dimension*scale);

            [[PHImageManager defaultManager] requestImageForAsset:asset
                                                       targetSize:size
                                                      contentMode:PHImageContentModeAspectFill
                                                          options:options
                                                    resultHandler:^(UIImage *result, NSDictionary *info) {
                                                        if (result) {
                                                            CGSize itemSize = CGSizeMake(60, 60);
                                                            UIGraphicsBeginImageContextWithOptions(itemSize, NO, 2);
                                                            CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
                                                            [result drawInRect:imageRect];
                                                            cell.imageView.image  = UIGraphicsGetImageFromCurrentImageContext();
                                                            UIGraphicsEndImageContext();
                                                        }
                                                        else{
                                                            UIImage *placeholder = [UIImage imageNamed:@"image-placeholder.jpg"];
                                                            CGSize itemSize = CGSizeMake(60, 60);
                                                            UIGraphicsBeginImageContextWithOptions(itemSize, NO, 2);
                                                            CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
                                                            [placeholder drawInRect:imageRect];
                                                            cell.imageView.image  = UIGraphicsGetImageFromCurrentImageContext();
                                                            UIGraphicsEndImageContext();
                                                        }
                                                    }];
        }
2个回答

5

这个问题实际上在这里:

PHCollection *collection = fetchResult[indexPath.row];

然后在这里:

PHAsset *asset = [fetchImage firstObject];

你正在使用PHCollection获取集合,然后假定所有资源都是PHAssets,而没有正确检查这是否属实。 实际上,PHCollection两个可能的子类PHAssetPHCollectionList,而PHCollectionList是在此处引发错误的原因。 在PHCollection *collection = fetchResult[indexPath.row];之后的代码中加入对PHAsset的检查,问题应该就解决了:
if ([collection isKindOfClass:[PHAssetCollection class]]) {
//code 
}

我知道这很老了,但是我的一个应用程序刚刚出现了完全相同的异常,我想知道是否有可靠的方法来触发此问题。 - lyio

0

首先,使用PHAsset获取所有资产,如下:

dispatch_async(dispatch_get_main_queue(), ^{     

        AllPhotos=[[NSMutableArray alloc] init];
        PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
        for (PHAsset *asset in result)
        {
            [AllPhotos addObject:asset];

        }
        [self.collectionView reloadData];

        // code here
    });

不要使用CollectionView代理方法,像这样

  PHImageManager *manager = [PHImageManager defaultManager];
    PHAsset *asset = [AllPhotos objectAtIndex:indexPath.row];
    PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
    requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
    requestOptions.synchronous = false;

    //CGFloat scale = 1.5; //or an even smaller one
    if (!manager)
    {
        manager = [[PHCachingImageManager alloc] init];
    }
    if (!requestOptions)
    {
        requestOptions = [[PHImageRequestOptions alloc] init];
    }

    [manager requestImageForAsset:asset
                       targetSize:CGSizeMake(imagesize.width,imagesize.height)
                      contentMode:PHImageContentModeAspectFill
                          options:requestOptions
                    resultHandler:^void(UIImage *image, NSDictionary *info)
     {
         [imageview setImage:image];
     }];

    [cell.contentView addSubview:imageview];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接