[UIImageView CGImage]:无法识别的选择器发送到实例 0x1783e5b00

Posted

技术标签:

【中文标题】[UIImageView CGImage]:无法识别的选择器发送到实例 0x1783e5b00【英文标题】:[UIImageView CGImage]: unrecognized selector sent to instance 0x1783e5b00 【发布时间】:2014-03-14 19:03:40 【问题描述】:

我已经连续遇到这个问题大约 3 个小时了,我正要把我的 Mac 扔到房间的另一边。

所以基本上,我正在尝试将 UIImage 传递给另一个视图控制器。我有设置,所以当用户点击其中一个 UIColectionViewCells 时,它会将它们发送到具有全屏 UIImageView 的另一个视图。我似乎无法弄清楚如何将 UIImage 从 ViewController1 获取到 ViewController2。

这是我的一些代码。请记住,我正在尝试将这个 UIImage selectedImage 从 VC1 获取到 VC2。

collectionView cellForItemAtIndexPath

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    NSString *CellIdentifier = @"GalleryCell";
    GalleryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

    [cell.layer setBorderWidth:2.0f];
    [cell.layer setBorderColor:[UIColor whiteColor].CGColor];
    [cell.layer setCornerRadius:5.0f];

    UIImage *usingImage = [imageArray objectAtIndex:indexPath.row];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:usingImage];
    imageView.tag = 100;
    imageView.frame = CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height);

    [cell addSubview:imageView];

    return cell;

collectionView didSelectItemAtIndexPath

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    UICollectionViewCell *selectedCell = [collectionView cellForItemAtIndexPath:indexPath];
    UIImage *selectedImage = (UIImage *)[selectedCell viewWithTag:100];

    [self performSegueWithIdentifier:@"GotoDetail" sender:nil];

【问题讨论】:

什么时候崩溃?你能告诉我们吗?请耐心等待。这不是一个很大的任务。 【参考方案1】:

可能是以下行导致此问题:

UIImage *selectedImage = (UIImage *)[selectedCell viewWithTag:100];

当您使用viewWithTag: 时,它将返回与单元格关联的UIImageView,而不是UIImage

你需要改变它:

UIImageView *selectedImageView = (UIImageView *)[selectedCell viewWithTag:100];
UIImage *selectedImage = selectedImageView .image;

为了传递数据,将选定的图像存储在一个实例变量(Say selectedImage)中,您需要实现prepareForSegue:,例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
       
        if ([segue.identifier isEqualToString:@"GotoDetail"])
        
            YourDetailType *detailController = segue.destinationViewController;
            detailController.imageProperty= self.selectedImage;
           

【讨论】:

这绝对是一个错误,但我认为问题更多的是“假设我有这个图像,我如何将它交给其他 VC?” @CppiLove:很高兴 :) 我想你不会再扔你的 Mac 了 :)【参考方案2】:

您的代码存在多个问题:

    如果您没有从 dequeue 方法得到回调,您应该只向单元格添加图像视图。否则每次你回收一个单元格时,你都会向它添加另一个图像视图,所以一段时间后你会在一个单元格上拥有几十个图像视图。

    接下来,您不应将单元格用作存储图像的地方。您已经有一组图像。使用它通过所选单元格的 indexPath 将图像传递给另一个视图控制器。

这会导致您的崩溃,第 2 步将解决该问题:您将图像视图转换为 UIImage 类型,这是错误的。

最后,要将信息传递给细节视图控制器,请将属性 selectedRow(整数)或 selectedRowImage(UIImageView)添加到细节视图控制器。在您的 prepareForSegue 方法中,从 segue 获取目标视图控制器,将其转换为正确的类型,并使用所选单元格的 indexPath 设置属性。

【讨论】:

一种稍微减少状态污染的方法是使用segue的sender属性来转发选定的图像信息。它仍然有点恶心,但是,嘿,这是一个转场。 @IanHenry,您的意思是将所选单元格作为发件人传递给performSegueWithIdentifier:sender:?是的,我想你可以做到。 只添加一次图像视图的更好的解决方案是将图像视图放在故事板本身中,这样您就不必担心了。 @DuncanC 我看错了你答案的最后一段;在prepareForSegue 期间轮询集合视图的选定行根本不会造成状态污染。似乎相当于使用sender @David,没错,但处理自定义单元格模板可能有点超出 OP 当前的能力。【参考方案3】:

[selectedCell viewWithTag:100]UIImageView 而不是 UIImage,投射不起作用。

[(UIImageView *)[selectedCell viewWithTag:100]].image;

您可以尝试像这样获取 UIImageViewUIImage 引用。

...但我同意 Duncan C,您应该重新考虑如何获取图像,而不仅仅是从单元格的 UIImageView 中获取它们。

【讨论】:

以上是关于[UIImageView CGImage]:无法识别的选择器发送到实例 0x1783e5b00的主要内容,如果未能解决你的问题,请参考以下文章

无法识别的选择器发送到 UIButton+AFNetworking.h 的实例(UIImageView+AFNetworking 也是)

UIImageView |无法识别的选择器发送到实例 | Xcode 6.4 | iOS 8.4

将 UIImage 转换为 CGImage 以获取像素颜色

iOS:无法识别子视图上的手势

使用 CGContext 缩放到小尺寸时,CGImage 的像素数据不完整

在swift中从UIImage / CGImage获取像素数据作为数组