3

UIActivityIndi​​cator の IBOutlet をカスタム セルに追加しましたが、すべてのセルに表示されるわけではありません。最初の 2 ~ 3 だけで、その後は何も表示されません。もう1つ、テーブルをスクロールして最初の3つのセルに戻ると、これらのセルからもUIActivityIndi​​catorが消えます...

コード:

Cell.h

@interface Cell : UITableViewCell

@property (strong, nonatomic) IBOutlet UIImageView *image;
@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

@end

Cell.m

@implementation Cell

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        // change to our custom selected background view
    }
    return self;
}

@end

ストーリーボードでは、UIactivityIndi​​cator が次のように設定されています。

テスト目的で...

と:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";
    Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // load the image for this cell
    Wallpaper *wallpaper = [xmlParser.wallpapers objectAtIndex:indexPath.row];

    cell.label.text = wallpaper.title;
    NSString *imageToLoad = wallpaper.thumbnail;

    [cell.image setImageWithURL:[NSURL URLWithString:imageToLoad] placeholderImage:nil options:SDWebImageProgressiveDownload progress:^(NSUInteger receivedSize, long long expectedSize)
     {

     }
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)
     {
         //[cell.activityIndicator stopAnimating];
     }];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                     initWithTarget:self action:@selector(tapped:)];
    [cell.image addGestureRecognizer:tap];
    [cell.image setTag:indexPath.row];

    CALayer * l = [cell.image layer];
    [l setMasksToBounds:YES];
    [l setCornerRadius:5.0];
    cell.layer.cornerRadius = 7.0;


    return cell;
}
4

3 に答える 3

1
  1. を実行しているコード全体をコメントアウトするとsetImageWithURL、テーブルのすべての行でアニメーション化されたアクティビティ インジケーターが正常に表示されますか? UIActivityIndicatorViewまず、正しく動作していることを確認しましょう。コメントアウトしたときに機能する場合setImageWithURL、問題は明らかにそこにあります。を無効にしても機能しない場合setImageWithURLは、より根本的な問題があります。アクティビティ インジケーターが正常に開始されていることを確認しましょう。IB で有効にしていると思いますが、(適切な場合) で手動で有効にすることcellForRowAtIndexPathをお勧めします。

  2. 完成したブロックでは、問題のセルがまだ画面上にあり、キューから取り出されて再利用されていないことを確認する必要があります (たとえばcell = [tableView cellForRowAtIndexPath:indexPath]、非値の呼び出しと確認)。これは、非同期で動作nilしていると想定しているためです。setImageWithURL(注: このUITableViewインスタンス メソッド はcellForRowAtIndexPath、同様の名前のメソッドと混同しないでくださいUITableViewController。) セルがまだ画面上にあると仮定するこの種のロジックは、テーブルビュー セルに対して非同期操作を行うたびに問題になる可能性があります。一部の非同期更新が適切に更新されていないという事実を聞くと、キューから取り出されたセルについて心配します。(このStack Overflow Answerの私のポイント#3を参照してくださいセルがまだ表示されているかどうかを確認する方法の例。少し異なる答えですが、考える必要がある種類の問題の例を示します。)

  3. 無関係ですが、毎回 UITapGestureRecognizer を追加するわけではありません。数十回のタップ ジェスチャ レコグナイザーを使用して、キューから取り出されて数十回再利用されたセルを危険にさらしていませんか? UITableViewCellサブクラスでそれを行う方が良いです。私は通常それを行います(イメージビューがまだ存在しないため、メソッドlayoutSubviewsでそれを実行しようとすると機能しません)。init

于 2012-12-10T20:31:23.130 に答える
0
NINetworkImageView *imageView=[[NINetworkImageView alloc]init];
imageView.delegate=self;
[imageView setPathToNetworkImage:[NSString stringWithStdString:imageUrl]];

このタスクを解決するには、サードパーティ クラスを使用します。

于 2014-04-29T10:46:07.950 に答える
0

試す...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
     static NSString *CellIdentifier = @"CustomCell";
    Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.activityIndicator.hidden = NO;
    [cell.activityIndicator startAnimating];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]];

    // load the image for this cell
    Wallpaper *wallpaper = [xmlParser.wallpapers objectAtIndex:indexPath.row];

    cell.label.text = wallpaper.title;
    NSString *imageToLoad = wallpaper.thumbnail;

    [cell.image setImageWithURL:[NSURL URLWithString:imageToLoad] placeholderImage:nil options:SDWebImageProgressiveDownload progress:^(NSUInteger receivedSize, long long expectedSize)
     {

     }
                      completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)
     {
         //[cell.activityIndicator stopAnimating];
     }];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                 initWithTarget:self action:@selector(tapped:)];
    [cell.image addGestureRecognizer:tap];
    [cell.image setTag:indexPath.row];

    CALayer * l = [cell.image layer];
    [l setMasksToBounds:YES];
    [l setCornerRadius:5.0];
    cell.layer.cornerRadius = 7.0;


    return cell;
}
于 2012-12-10T20:35:48.313 に答える