【问题标题】:Weird Custom UITableViewCell behavior奇怪的自定义 UITableViewCell 行为
【发布时间】:2014-10-06 20:19:57
【问题描述】:

自定义 UITableViewCell 遇到了一个非常奇怪的问题。顺便说一句,我正在使用 UIViewController。所以,我在 Storyboard 中制作了单元格(如下图所示),并将它的类设置为我的自定义 UITableViewCell 类。然后我在自定义单元类中创建了所有 IBOutlets 和 IBActions。

我的 cellForRowAtIndexPath 方法:

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

    static NSString *CellIdentifier = @"Cell";
    PostTableViewCell *cell = (PostTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
        cell = [[PostTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    [cell setCellContentWithPost:[PostsArray objectAtIndex:indexPath.row]];

    return cell;
}

我的自定义 UITableViewCell 类:

#import "PostTableViewCell.h"    
@implementation PostTableViewCell

- (void)setCellContentWithPost:(SDPost*)post {

    self.alpha = 0.f;
    self.postTitleLabel.text = post.title;

    [self.thumbnailImageView sd_setImageWithURL:[NSURL URLWithString:post.thumbnailURL] placeholderImage:nil options:SDWebImageHandleCookies];

    [UIView animateWithDuration:0.35 animations:^{
        self.alpha = 1.0f;
    }];

}

-(void)awakeFromNib{

    self.postTitleLabel.textColor = [UIColor whiteColor];
    self.postTitleLabel.font = [UIFont fontWithName:@"Montserrat-Regular" size:16.5];

    self.readingTimeView.backgroundColor = [UIColor colorWithRed:0.33 green:0.74 blue:0.15 alpha:1];
    self.readingTimeView.layer.cornerRadius = 4;
    self.readingTimeLabel.textColor = [UIColor whiteColor];
    self.readingTimeLabel.font = [UIFont fontWithName:@"Montserrat-Bold" size:11.75];

    self.commentsCountView.backgroundColor = [UIColor colorWithRed:0.74 green:0.19 blue:0.4 alpha:1];
    self.commentsCountView.layer.cornerRadius = 4;
    self.commentsCountLabel.textColor = [UIColor whiteColor];
    self.commentsCountLabel.font = [UIFont fontWithName:@"Montserrat-Bold" size:11.75];

}

我尝试通过 UITableViewCell 的 initWithStyle 方法设置单元格的样式,但由于某种原因它从未被调用,所以我最终在 awakeFromNib 中执行此操作。 所以,问题是:我认为我做错了什么,因为正如你在这个 GIF (https://dl.dropboxusercontent.com/s/6crcjbmitr5fmk7/Untitled%20%281%29.gif?m=) 中看到的那样,当我滚动单元格时,它得到的心形按钮会自动打开/关闭。

你们中的任何人都可以帮我解决这个问题吗?非常感谢!

【问题讨论】:

  • 点击心脏后是否更新数据源PostsArray?
  • 检查setCellContentWithPost中的代码。您必须重置heart button的图像
  • @jithinroy,不,我只是在更改心形按钮的图像。
  • 当用户选择心脏(选中)或未选中时,您应该在 PostArray 中有一个 Bool(选中或未选中)值。这里是类似的example Table View Accessory
  • 除非我错过了什么,否则我看不到任何设置心脏图像的代码。这正是您正在执行的代码,还是您在此处发布之前对其进行了修整?

标签: ios objective-c uitableview


【解决方案1】:

每次显示单元格时,它都会从 PostsArray 数组中获取值。所以当你点击心脏时,你应该更新它在数组中的对应对象。

【讨论】:

  • 当心形按钮被点击时,我不想改变任何东西。问题是心脏图像随机改变它的状态。无论如何,谢谢!
  • 您必须将您点击过心形按钮的地方存储起来。这样你就可以在 UITableView 再次尝试重绘你的单元格时使用它。
  • 这就是我所做的。检查我的答案。还是谢谢你!
【解决方案2】:

发生这种情况是因为您的所有单元格都有相同的 CellIdentifier,在这种情况下,如果您非常小心处理“心脏”元素的方式,这很好。

  1. 您应该有办法确定单元格上的哪些元素已被“点赞”。我想您需要知道您的用户在哪些元素上按下了心形按钮。
  2. 在初始化/重复使用您的单元格时,您需要确保将心形按钮正确设置为“红色/开启”或“白色/关闭”。

例如:

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

        static NSString *CellIdentifier = @"Cell";
        PostTableViewCell *cell = (PostTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[PostTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

        [cell setHeartState:[[AnArray objectAtIndex:indexPath.row] hasBeenLikedByUser]]


        [cell setCellContentWithPost:[PostsArray objectAtIndex:indexPath.row]];

        return cell;
    }

这只是一个草稿。

希望有帮助

【讨论】:

    【解决方案3】:

    我设法通过检查炉膛是否应该填满来解决这个问题。我使用 NSUserDefaults 存储了帖子 ID,并在 setCellContentWithPost 添加了一个 if 语句来检查单元格的帖子是否被收藏。

    感谢大家的关注!

    【讨论】:

    • 除非您需要在应用程序启动之间保持心脏的填充状态,否则您不应该为此使用 NSUserDefaults。相反,您应该创建一个属性(整数或数组,如果您希望存储多个 indexPaths)来存储 indexPath.row,并在 cellForRowAtIndexPath 中使用 if-else 子句来检查当前 indexPath.row 是否相同(或包含在数组中)作为存储在您的属性中的那个。
    • @rdelmar 我需要它在两次启动之间持续存在,这就是为什么使用 NSUserDefaults 保存它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多