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

时间:2014-03-14 19:03:41

标签: ios objective-c uiimage uicollectionview unrecognized-selector

我现在已经有这个问题大约3个小时,我准备把Mac扔到房间里。

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

以下是我的一些代码。记住,我正试图将这个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];
}

3 个答案:

答案 0 :(得分:3)

以下行可能导致此问题:

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;
        }   
}

答案 1 :(得分:3)

您的代码存在多个问题:

  1. 如果您没有从出列方法中回复,则应该只向图片添加图片视图。否则,每次回收一个单元格时,您都会向其中添加另一个图像视图,所以过了一段时间后,您将在单元格上有数十个图像视图。

  2. 接下来,您不应将单元格用作存储图像的位置。你已经拥有了一系列图像。使用它可以使用所选单元格的indexPath将图像传递到另一个视图控制器。

  3. 导致崩溃的原因,第2步将修复:您正在将图像视图转换为UIImage类型,这是错误的。

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

答案 2 :(得分:1)

[selectedCell viewWithTag:100] UIImageView ,而不是 UIImage ,投射无效。

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

您可以尝试像这样获取 UIImageView UIImage 参考。

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