自定义 UITableViewCell 在滚动时显示完整单元格之前不显示数据

Posted

技术标签:

【中文标题】自定义 UITableViewCell 在滚动时显示完整单元格之前不显示数据【英文标题】:custom UITableViewCell doesn't show data before showing full cell when scrolling 【发布时间】:2014-10-09 05:48:07 【问题描述】:

我的应用程序有自定义 UITableViewCell 高度为 470 像素。 我完全以编程方式创建了自定义单元格。

这是我的 cellForRowAtIndexPath 方法

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

pixDealsTableViewCell *dealCell = (pixDealsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Deals" forIndexPath:indexPath];

if (dealCell == nil) 

    dealCell = [[pixDealsTableViewCell alloc] init];


dealCell.dBusinessLogo.image = [pixUtil imageWithImage:[UIImage imageNamed:@"profile_icon"] scaledToSize:CGSizeMake(60, 60)];
[dealCell.dBusinessName setTitle:@"Business Name" forState:UIControlStateNormal];
dealCell.dTimeAgo.text = [NSString stringWithFormat:@"5 min ago"];
[dealCell.dHeading setTitle:@"Deals Head" forState:UIControlStateNormal];
[dealCell.dDescription setTitle:@"Descriptionskjdfnkjsdnfis" forState:UIControlStateNormal];
dealCell.dImage.image = [pixUtil imageWithImage:[UIImage imageNamed:@"carrier.png"] scaledToSize:CGSizeMake(290, 250)];
[dealCell.dLike setTitle:@"Like" forState:UIControlStateNormal];
[dealCell.dShare setTitle:@"Share" forState:UIControlStateNormal];

return dealCell;

这是我的自定义单元初始化方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) 
    // Initialization code
    NSLog(@"NEW CELL");
    customRed = [[UIColor alloc]initWithRed:209.0f/255.0f green:19.0f/255.0f blue:38.0f/255.0f alpha:1.0f];

    [self setBackgroundColor:[UIColor grayColor]];

    containerCell = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 300, 700)];
    [containerCell setBackgroundColor:[UIColor whiteColor]];

    self.dBusinessLogo = [[UIImageView alloc]initWithFrame:CGRectMake(15, 15, 60, 60)];
    self.dBusinessName = [[UIButton alloc]initWithFrame:CGRectMake(80, 20, 225, 20)];
    [self.dBusinessName setTitle:@"Business Name" forState:UIControlStateNormal];
    self.dBusinessName.titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [self.dBusinessName addTarget:self action:@selector(haveAccount:) forControlEvents:UIControlEventTouchUpInside];
    [self.dBusinessName setTitleColor:customRed forState:UIControlStateNormal];
    self.dTimeAgo = [[UILabel alloc]initWithFrame:CGRectMake(80, 50, 225, 15)];
    self.dHeading = [[UIButton alloc]initWithFrame:CGRectMake(15, 80, 290, 20)];
    self.dHeading.titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [self.dHeading addTarget:self action:@selector(haveAccount:) forControlEvents:UIControlEventTouchUpInside];
    [self.dHeading setTitleColor:customRed forState:UIControlStateNormal];

    self.dDescription = [[UIButton alloc]initWithFrame:CGRectMake(15, 105, 290, 50)];
    self.dDescription.titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [self.dDescription addTarget:self action:@selector(haveAccount:) forControlEvents:UIControlEventTouchUpInside];
    [self.dDescription setTitleColor:customRed forState:UIControlStateNormal];

    self.dImage = [[UIImageView alloc]initWithFrame:CGRectMake(15, 160, 290, 250)];
    self.dLike = [[UIButton alloc]initWithFrame:CGRectMake(10, 420, 150, 40)];
    self.dLike.titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [self.dLike addTarget:self action:@selector(haveAccount:) forControlEvents:UIControlEventTouchUpInside];
    [self.dLike setTitleColor:customRed forState:UIControlStateNormal];

    self.dShare = [[UIButton alloc]initWithFrame:CGRectMake(160, 420, 150, 40)];
    self.dShare.titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [self.dShare addTarget:self action:@selector(haveAccount:) forControlEvents:UIControlEventTouchUpInside];
    [self.dShare setTitleColor:customRed forState:UIControlStateNormal];

    [self.contentView addSubview:containerCell];
    [self.contentView addSubview:self.dBusinessLogo];
    [self.contentView addSubview:self.dBusinessName];
    [self.contentView addSubview:self.dTimeAgo];
    [self.contentView addSubview:self.dHeading];
    [self.contentView addSubview:self.dDescription];
    [self.contentView addSubview:self.dImage];
    [self.contentView addSubview:self.dShare];

   // NSLog(@"Deals View added");


return self;

这是我完整查看的 UITableViewCell。

当我向下滚动到下一个单元格时,它无法正确加载。

将单元格完全向上滚动后正确加载

请帮我解决这个问题。

【问题讨论】:

添加您的 cellForRowAtIndexPath 代码以供参考 当你分配你的单元格时,使用 initWithReuseIdentifier: 否则它总是会创建一个新的单元格。您也可以尝试使用 dequeueReusableCellWithIdentifier: 而不是 dequeueReusableCellWithIdentifier:forIndexPath: @Imotep 我在视图控制器中注册了单元格 [dealsTableView registerClass:[pixDealsTableViewCell class] forCellReuseIdentifier:@"Deals"];所以它不会每次都创建新的单元格。我检查了 NSLog。 @mehulpatel 我如何实现-layoutForSubviews? tableViewCell 没有那个方法? @mehulpatel 我用 customcell 初始化方法更新了帖子。你能解释一下我如何实现 layoutSubviews 方法吗? 【参考方案1】:

终于得到了答案。我创建了高度为 700 的 containerCell 视图。但单元格高度仅为 470。 我将 containerCell 视图高度更改为 470。它解决了我的问题。 :)

【讨论】:

以上是关于自定义 UITableViewCell 在滚动时显示完整单元格之前不显示数据的主要内容,如果未能解决你的问题,请参考以下文章

UITableviewCell 在我滚动时显示另一个单元格的文本

如何自定义滑动 UITableViewCell 时显示的删除按钮

UITableviewCell在ios中滚动时显示不正确

ios - UITableViewCell 滚动时显示错误数据

自定义 UITableViewCell 图像直到滚动才显示

自定义 UITableViewCell 快速滚动