我已经看到这个问题了很多,但是没有找到我需要的好榜样。到处都有人指定第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,但正如我所说,他们已经设置了行,他们知道哪一行应该是哪个单元格。我需要经常检查。答案 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方法中使用这些标识符