故事板中自定义单元格中的UIActivity指示符



我已经在自定义单元格中添加了UIActivityIndicator的IBOutlet,但它并没有显示在每个单元格上,只显示在前2-3个单元格上,然后什么都没有。另一件事是,当我滚动表格并返回前3个单元格时,UIActivityIndicator也会从这些单元格中消失。。。

代码:

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

在情节提要中,UIactivityIndicator设置为:行为:-动画

出于测试目的。。。

和:

- (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;
}
  1. 如果您注释掉执行setImageWithURL的整段代码,那么您是否成功地在表的所有行上获得了动画活动指示器?让我们首先确保您的UIActivityIndicatorView工作正常。如果在注释setImageWithURL时它有效,那么问题显然就在那里。如果它不起作用,即使您禁用了setImageWithURL,那么您就有了一个更根本的问题。让我们确保您成功启动活动指示器。我知道你在IB中打开了它,但我真的建议在cellForRowAtIndexPath中手动打开它(在适当的时候),而不是依赖于它为你启动。

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

  3. 无关,但我不会每次都添加UIMapGestureRecognizer。你不是在冒着一个已经出列并重复使用了十几次的细胞拥有十几个敲击手势识别器的风险吗?最好在UITableViewCell子类中进行。我通常在layoutSubviews中进行(如果您尝试在init方法中进行,则不会起作用,因为imageview还不存在)。

尝试。。。

- (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;
}
NINetworkImageView *imageView=[[NINetworkImageView alloc]init];
imageView.delegate=self;
[imageView setPathToNetworkImage:[NSString stringWithStdString:imageUrl]];

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

相关内容

  • 没有找到相关文章

最新更新