我有一个组织文字笔记的应用程序。我正在添加允许将照片添加到(UITextView)注释的功能。我添加了一个子类UICollectionViewController来显示用户照片,他们可以从中选择一个插入到他们的笔记中。
下面的UICollectionView委托方法用于使用照片填充集合视图。我已经使用apps桌面图标作为'photoImage'的测试图像测试了这个视图控制器,并且一切正常。
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
PHAsset *asset = (PHAsset *)[fetchResult objectAtIndex:indexPath.row];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
options.synchronous = YES;
NSLog(@" **** calling requestImageForAsset");
__block UIImage *photoImage;
__block dispatch_semaphore_t sema = dispatch_semaphore_create(0);
(void) [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(80.0,80.0) contentMode:PHImageContentModeAspectFit options:options
resultHandler:^(UIImage *img, NSDictionary *info)
{
NSError *e = [info objectForKey:PHImageErrorKey];
NSLog(@" **** error code (%ld), descr (%@)", (long)e.code, e.localizedDescription);
NSLog(@" **** img (%p)", img);
photoImage = img;
dispatch_semaphore_signal(sema);
}
];
NSLog(@" **** returned from requestImageForAsset");
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
UIImageView *photoView = [[UIImageView alloc] initWithImage:photoImage]; <=== Thread 1: EXC_BAD_ACCESS (code=1, address=0x18)
UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"Photo" forIndexPath:indexPath];
[cell.contentView addSubview:photoView];
return cell;
}
我的问题出在requestImageForAsset:call的resultHandler中。显示NSLog()输出的Xcode日志如下所示。
2014-12-13 13:18:18.918 iFilebox [23637:866056] ****调用requestImageForAsset 2014-12-13 13:18:18.939 iFilebox [23637:866056] ****错误代码(0),descr((null))&lt; ===没有错误报告2014-12-13 13:18:18.939 iFilebox [23637:866056] **** img(0x7fb4a97b6580)&lt; ===这是一个有效的内存地址吗? 2014-12-13 13:18:19.940 iFilebox [23637:866056] ****从requestImageForAsset返回
在我想要获取所获取的图像并将其添加到集合视图单元格的位置,您可以看到问题:EXC_BAD_ACCESS。我尝试了几种变体作为解决方法无济于事。同样,如果我使用已知的静态图像代替从resultHandler返回的引用图像,则此代码可以正常工作。
有人可以解释为什么这段代码不起作用,如果它应该=,为什么不呢?有没有人对解决方法有任何想法?
答案 0 :(得分:0)
即使你设置了同步我想知道它是否到达你想要实例化你的UIImage photoView的行,然后它实际上完成了你标记img的结果。尝试将img设置为requestImageForAsset的完成块中的cell.backgroundView,看看是否有效。
此外,也许它只是偏好,但我会先实例化你的细胞,然后才能做到这一点。实际上,您可能希望对单元格进行子类化并将图像设置在子类中。