3

我已将 UIActivityIndi​​cator 的 IBOutlet 添加到自定义单元格,但它并未显示在每个单元格上,仅在前 2-3 上显示,然后什么也没有。另一件事,当我滚动表格并返回前 3 个单元格时,UIActivityIndi​​cator 也会从这些单元格中消失......

代码:

细胞.h

@interface Cell : UITableViewCell

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

@end

细胞.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 中打开它,但我真的建议您在 IB 中手动打开它(在适当的时候)cellForRowAtIndexPath,而不是依赖它为您启动它。

  2. 在您完成的块中,您确实应该检查以确保有问题的单元格仍在屏幕上并且没有被出列和重用(例如调用cell = [tableView cellForRowAtIndexPath:indexPath]并确认非nil值),因为我假设您setImageWithURL正在异步操作。(注意:此UITableView实例方法cellForRowAtIndexPath不应与名称相似的UITableViewController方法混淆。)每当您对 tableview 单元格执行异步操作时,这种关于假设单元格仍在屏幕上的逻辑可能会出现问题。当我听说某些异步更新没有正确更新的事实时,我担心出队的单元格。(请参阅我在此Stack Overflow 上的第 3 点答案有关如何检查单元格是否仍然可见的示例;这是一个略有不同的答案,但为您提供了一个您需要考虑的问题的示例。)

  3. 不相关,但我不会每次都添加 UITapGestureRecognizer。你不是在冒险一个已经出列并重复使用十几次的单元格有十几个点击手势识别器吗?最好在您的UITableViewCell子类中进行。我通常这样做layoutSubviews(如果你尝试在你的init方法中这样做,因为 imageview 还不存在)。

于 2012-12-10T20:31:23.130 回答
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 回答
0
NINetworkImageView *imageView=[[NINetworkImageView alloc]init];
imageView.delegate=self;
[imageView setPathToNetworkImage:[NSString stringWithStdString:imageUrl]];

使用第三方类来解决此任务。

于 2014-04-29T10:46:07.950 回答