UITableView中的cell imageView直到被选中才会出现

时间:2012-02-19 19:49:31

标签: ios uitableview imageview assets

  1. 以下是该问题的视频:http://youtu.be/Jid0PO2HgcU

  2. 尝试从资产库中为UITableView设置[cell imageView]的图像时遇到问题。

  3. 图像已加载,但在触摸(选择)该单元格之前,图像不会出现在单元格中。这是我的代码,用于设置单元格的imageView:

    //Start loading the image using the image path
    NSString *path = [occasion imagePath];
    
    if (path != nil && [path hasPrefix:@"ass"])
    {
    NSLog(@"photo loaded from assets library");
    //testing ALAssestLibrary
    ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
    
    ALAssetsLibraryAssetForURLResultBlock resultsBlock = ^(ALAsset *asset)
    {
        ALAssetRepresentation *representation = [asset defaultRepresentation];
        CGImageRef imageRef = [representation fullResolutionImage]; 
        UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
    
    
        [[cell imageView] setImage:[image imageByScalingAndCroppingForSize:CGSizeMake(36.0, 42.0)]];     
    
        [image release];
    };
    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){
    
        NSLog(@"FAILED! due to error in domain %@ with error code %d", error.domain, error.code);
        // This sample will abort since a shipping product MUST do something besides logging a
        // message. A real app needs to inform the user appropriately.
        abort();
    };        
    
    //Convert path to an NSUrl
    NSURL *url = [NSURL URLWithString:path];
    
    
    // Get the asset for the asset URL to create a screen image.
    [assetsLibrary assetForURL:url resultBlock:resultsBlock failureBlock:failureBlock];
    // Release the assets library now that we are done with it.
    [assetsLibrary release]; 
    }
    

    以上代码是:

    的一部分
    - (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
    

    有什么想法吗?

8 个答案:

答案 0 :(得分:40)

我认为在这种情况下你使用iOS定义的UITableViewCell(而不是自定义的),这是你从“initWithStyle:reuseIdentifier:”获得的那些单元格之一。现在这些单元格内部构建的方式是,如果您不立即分配某些内容,则不会在单元格的contentView层次结构中添加相应的子视图。这种行为是复杂自定义视图的典型行为,其中最终单元格布局只有在其所有子视图的内容都已完全指定时才能确定。 (例如,你有两个标签,比如标签A和标签B,标签A是多行的,你想在标签A的正下方添加标签B,那么只有在你有标签-A内容后才能正确放置标签-B并计算它的高度。所以我认为内置的iOS表格单元格以相同的方式完成,子视图层次结构是在“layoutSubviews”阶段构建的。

在您的情况下,您创建单元格但延迟提供图像的时间。但是此时layoutSubviews已被调用,没有任何图像,相应的imageView甚至没有被分配并添加到contentView层次结构中!

所以,根据我的说法,您的解决方案就是立即为您的资产分配一个“占位符”(占位符当然可以是透明图像),这将保证您创建内部UIImageView。小心图像大小,它应该接近预期的图像大小,原因与上面解释的相同。调用完成块后,图像视图应该已经存在,图像将会出现。

当您点击单元格时出现图像的原因是,此操作再次调用layoutSubviews。在这种情况下,可能会重新执行整个代码,并且在此之前已经调用了“setImage:”,然后设置内部“image”属性,并使用新图像重建contentView层次结构。

您的问题的另一个可能的解决方案当然是使用“自定义”UITableViewCell(例如从Nib加载)。在这种情况下,所有子视图都将被加载,您只需使用他的标签访问UIImageView(阅读苹果文档以了解更多有关从Nib文件创建表视图单元的有用技术)。

答案 1 :(得分:26)

您需要在图像集

之后布局单元格

就像

一样
  

[cell setNeedsLayout];

答案 2 :(得分:6)

我长时间挠了头,终于想通了。

我的错误是当我设置实际出口cell.imageView时,我在cell.eventImageView设置图像。它正在弄乱UITableViewCell中提供的通用图像视图。希望它对某人有所帮助。

答案 3 :(得分:1)

这是我解决这些问题的方式,我知道这不是最好的,但是那项工作:)

    UIImage *thumbnailImage = ...

    dispatch_async(dispatch_get_main_queue(), ^{
        [cell.imageView setImage:thumbnailImage];

        UITableViewCellSelectionStyle selectionStyle = cell.selectionStyle;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        [cell setSelected:YES];
        [cell setSelected:NO];
        cell.selectionStyle = selectionStyle;
    });

答案 4 :(得分:1)

在我的情况下,我是通过Storyboard设置原型单元格,但却意外地使用了dequeueCellWithIdentifier:forIndexPath方法而不是dequeueCellWithIdentifier:

第一种方法仅在通过程序化UITableView registerClass:forReuseIdentifier:registerNib:forReuseIdentifier方法将细胞分配到tableview时使用。

答案 5 :(得分:0)

我遇到了类似的问题。我已经注册了默认的UITableViewCell类而不是我的自定义类。

我有这个:

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: visibilityCellIdentifier)

但我应该有这个:

tableView.registerClass(VisibilityCell.self, forCellReuseIdentifier: visibilityCellIdentifier)

当我逐步调试调试器时,单元格创建看起来都有效,但在我选择每一行之前都没有显示任何内容。

答案 6 :(得分:0)

有时,当您使用带有标签,图片等的自定义UITableViewCell时,以及您正在设置单元格的默认UILabel的某个地方。例如

customCell.textLabel.text = @"some text"

要解决此问题,请避免使用默认标签,而是在自定义单元格中添加自己的UILabel。

答案 7 :(得分:0)

使用此代码时出现同样的问题:

cell = [tableView dequeueReusableCellWithIdentifier:kCellSection1 forIndexPath:indexPath];
        if (indexPath.row == 0) {
            cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];
            cell.textLabel.text = @"Vote Up for me if it help for you!";
        }

但我通过替换来修复它:

cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];

要:

cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];