【问题标题】:UIImageView goes black inconsistentlyUIImageView 变黑不一致
【发布时间】:2012-08-12 14:58:43
【问题描述】:

我有一个 UITableView,在每个单元格中包含一些视图,其中一个视图是 UIImageView。 在 cellForRow 方法中,我正在加载带有图像的 UIImageView,但有时,UIImageView 只是显示黑屏。

我认为这可能有两个原因 - UIImage 损坏或内存问题。

UIImage 没有损坏(它始终是同一个 UIImage),我什至检查了当我放置手动损坏的图像时的行为 -> 它变白了!不是黑色的……

我检查是否有一些内存警告,ViewDidUnload 启动 -> 什么都没有。甚至在模拟器中模拟出内存警告,也没什么,跟那个没有关系。

有人知道为什么会这样吗?

谢谢!


这是我的 cellForRow 方法。 基本上,它是一个顶部有 UIWebView 和 UIImageView 的单元格列表,当表格滚动时,我隐藏 webview 并显示 imageview,反之亦然。也许这与我的问题有关,但我对此表示怀疑,因为图像是相同的,而 uiimagaview 没有发布。

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {   
   ImMailMessage *message = [_messages objectAtIndex:indexPath.row];

ImFullMessageTableViewCell *cell = (ImFullMessageTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"ImFullMessageTableViewCell"];

if (cell == nil)
{
    cell = [[[NSBundle mainBundle] loadNibNamed:@"ImFullMessageTableViewCell" owner:self options:nil] objectAtIndex:0];
    cell.delegate = self;

    //add gestures
    UIPinchGestureRecognizer *pinchGesture = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(cellPinched:)] autorelease];
    [cell addGestureRecognizer:pinchGesture];
    pinchGesture.delegate = self;

    UIPanGestureRecognizer *panGesture = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(cellPanned:)] autorelease];
    panGesture.minimumNumberOfTouches = 2;
    [cell addGestureRecognizer:panGesture];
    panGesture.delegate = self;

}


cell.threadState = _state;
cell.mailMessage = message;


UIImage *image = [self imageForMailMessage:message];
if (!image)
{
    // if no image, put the webview and reload it.
    cell.webView.mailMessage = message;     
    cell.webViewImageView.hidden = YES;
    cell.webViewImageView.image = nil;
    [cell.webView reloadMailMessage];

}
else // image exists!
{
    cell.webViewImageView.image = image;

    // replace the web view with the recived image.
    [cell replaceWebViewWithImageView];
}


return cell;
}

【问题讨论】:

  • 你能发布你的 cellForRow 代码吗?
  • 为了更好地解决您的问题,我们需要您的 cellForRowAtIndexPath: 方法的代码
  • 嗨,添加了 cellForRow 方法...

标签: iphone objective-c ios uitableview uiimageview


【解决方案1】:

因此,在您的“cellForRow”中,您首先尝试回收旧单元格,然后如果没有可用的单元格,则创建一个新单元格。在那之后,您以某种方式获得了对 UIImageView 的访问权限(或者您正在使用单元格提供的那个?)

我要做的第一件事是在 cellForRow 中甚至不设置图像 - 找到 UIImageView,然后记录它或 assert() 它在那里,然后将背景颜色设置为绿色“:

imageView.backgroundColor = [UIColor greenColor];

如果您在图像所在的位置看到一堆绿色矩形,那么您可以继续下一步(在移除绿色背景之后!),并设置图像 - 但每次设置图像时都要记录,即在设置之前记录图像,这样您就可以 100% 确定实际上您有一个有效的图像。

如果你走到这一步,你得到了绿色,你记录了你的图像,但它仍然无法正常工作,然后添加评论,我会回来查看。

编辑:所以继续不要写图像 - 你现在应该有一个 imageView 只是绘制它的背景。

添加委托方法:“- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath "

在此处放置一个日志,并为每个单元格记录其索引、imageView、imageView.backgroundColor 和 imageView.image(应该为零!)。我怀疑你会发现背景颜色不是绿色,或者有一些图像

【讨论】:

  • 嗨,首先我添加了 cellForRow 方法。这是一个自定义单元格,因此它有自己的 UIImageView。我看到了绿色的矩形和原木,但仍然,有时它看起来是黑色的。不要为什么,很奇怪……
  • 很好 - 所以即使没有设置图像,有时它也是黑色的。好吧,这意味着它与您的图像无关 - 我现在将编辑我的答案。所以当你创建一个cell时,你添加一个新的UIImageCView,当你得到一个回收的cell时,你只是从cell contentView中检索imageView?
  • 好的,找到问题了!问题出在图像上。我在下面捕获了 webview,但有时当 webview 被隐藏时我会这样做。那就是问题所在!您实际上通过我所做的测试引导我找到了解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
相关资源
最近更新 更多