1

UITableViewがあり、各セルにいくつかのビューが含まれています。ビューの1つはUIImageViewです。cellForRowメソッドで、UIImageViewに画像を読み込んでいますが、UIImageViewに黒い画面が表示されることがあります。

UIImageの破損またはメモリの問題の2つの理由が考えられます。

UIImageは破損しておらず(常に同じUIImageです)、手動で破損した画像を配置したときの動作も確認しました->白くなります!黒ではない...

いくつかのメモリ警告があるかどうかを確認します。ViewDidUnloadの起動->何もありません。シミュレータでシミュレートされたメモリ警告でさえ、何も、それはそれとは何の関係もありません。

なぜそれが起こっているのか誰かが何か手がかりを持っていますか?

ありがとう!


これが私のcellForRowメソッドです。基本的に、これはUIWebViewとUIImageViewが上にあるセルのリストであり、テーブルがスクロールすると、Webビューを非表示にして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;
}
4

1 に答える 1

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をログに記録します(nilである必要があります)。背景色が緑ではないか、画像があるのではないかと思います

于 2012-08-12T17:18:14.573 に答える