uitableview与多个自定义单元格滚动和重用问题

时间:2014-05-27 07:48:33

标签: ios objective-c xcode uitableview

我已经看到这个问题了很多,但是没有找到我需要的好榜样。到处都有人指定第0行需要是这个单元格,第1行需要是那个单元格,其他人需要其他东西。

我需要根据数据区分我的细胞。让我们说这就是我的NSMutableArray词典:

{(
  actionContent = "some comment",
  actionType = "comment",
  datetime = "some date",
  whosAction = "some person"
),
(
  actionContent = "",
  actionType = "like",
  datetime = "some date", 
  whosAction = "another person"
),
(
  actionContent = "blah blah blah mentioned you",
  actionType = "mention",
  datetime = "some date",
  whosAction = "person"
)}

这样的东西,我知道语法可能很远。所以为此我创建了两个自定义单元格,在cellForRowAtIndexPath中运行一堆if语句来查看要使用的单元格。第一个单元格只有一个UITextView,它适用于喜欢,第二个单元格有两个UITextViews,用于评论和提及。

问题:当我滚动表格时,第二个单元格进入视图,我收到此错误(所有UITextViews都有轻击手势):

-[FirstCell secondTap]: unrecognized selector sent to instance 0xa872020

FirstCell没有"秒" UITextView所以不应该是任何secondTap ...所以显然我在cellForRowAtIndexPath中使用了错误的多个单元格。我现在要显示我的代码:

FirstCell:

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    UITextView *first = [[UITextView alloc]initWithFrame:CGRectMake(55, 15, 250, 20)];
    [first setFont:[UIFont systemFontOfSize:10]];
    [first setTextColor:[UIColor blueColor]];
    [first setEditable:NO];
    [first setScrollEnabled:NO];
    [first setSelectable:YES];
    [first setUserInteractionEnabled:YES];
    [first setAllowsEditingTextAttributes:YES];
    first.textContainerInset = UIEdgeInsetsMake(3, 0, 0, 0);
    UITapGestureRecognizer *firstTap = [[UITapGestureRecognizer alloc]init];
    _firstTap = firstTap;
    [first addGestureRecognizer:_firstTap];
    [self addSubview:_first];
}

SecondCell:

//same _first UITextView and a second one
    UITextView *first...

    UITextView *second = [[UITextView alloc]initWithFrame:CGRectMake(55, 20, 250, 30)];
    [second setFont:[UIFont systemFontOfSize:10]];
    [second setEditable:NO];
    [second setScrollEnabled:NO];
    [second setSelectable:YES];
    [second setUserInteractionEnabled:YES];
    [second setAllowsEditingTextAttributes:YES];
    second.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0);
    UITapGestureRecognizer *secondTap = [[UITapGestureRecognizer alloc]init];
    _secondTap = secondTap;
    [second addGestureRecognizer:_secondTap];
    _second = second;
    [self addSubview:_second];

我确定问题出在这里... cellForRowAtIndexPath:

static NSString *cellIdentifier = @"cell";
if (myData.count != 0) {
    if ([[[myData objectAtIndex:indexPath.section]valueForKey:@"actionContent"]isEqualToString:@""]) {
        FirstCell *cell = (FirstCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (!cell) {
            cell = [[FirstCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        //run if statements to checks if this is a likes or friend requests
        return cell;
    }else{
        SecondCell *cell = (SecondCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (!cell){
            cell = [[SecondCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        //run if statements to check if comments or mentions
        return cell;
    }
}else{
    //use FirstCell to display empty message
}
return nil;

我希望这不是太长,我希望我很清楚。我想我错误地将它们初始化了。有什么建议如何使这项工作?

BTW:我使用this example,但正如我所说,他们已经设置了行,他们知道哪一行应该是哪个单元格。我需要经常检查。

2 个答案:

答案 0 :(得分:4)

您对两种不同的细胞类型使用相同的细胞标识符(“细胞”)。尝试为FirstCell提供类似@"firstCell"的标识符,将第二个标识符设为@"secondCell"

答案 1 :(得分:2)

我认为您的问题是您没有覆盖UITableViewCell子类中的PrepareForReuse Methode。

您需要在重用之前清理插入的UITextView。否则,它们会在重复使用时一次又一次地添加。

就像那样:

-(void)prepareForReuse
{
    [super prepareForReuse];

    [self.first removeFromSuperview];
    self.first = nil;

    [self removeGestureRecognizer:self.firstTap];
    self.firstTap = nil;
}

此外,您的单元格应该有两个不同的标识符。 为此,您必须在实例化tableView后插入这些行:

[self.tableView registerClass:[FirstCell class] forCellWithReuseIdentifier:@"firstCell"];
[self.tableView registerClass:[SecondCell class] forCellWithReuseIdentifier:@"secondCell"];

然后在cellForRow方法中使用这些标识符