0

我正在将包含美国州数据的字典元素数组加载到 UITableView 中,当用户向下滚动到屏幕外项目时,我遇到了重复的行 - 第 1 行在第 8 行重复,第 2 行在第 9 行重复,等等。

我已经查看了以下 SO 问题并实施了他们的一些建议(没有成功):

2994472 - 我的 UITableView 有重复的行

7056578 - UITableView 滚动时重复单元格

UITableViewCell 是一个自定义结构,由 UILabel 创建。这是 cellForRowAtIndexPath 中的代码。

00    const int ABBREVIATION = 1, STATE = 2 // Declared outside cellForRowAtIndexPath


01    static NSString *CellIdentifier = @"Cell";
02    
03    UILabel *abbreviation, *state;
04    
05    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
06    if (cell == nil) {
07        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault         
08              reuseIdentifier:CellIdentifier];
09        
10        abbreviation = [[UILabel alloc] initWithFrame:CGRectMake(7.0, 1.0, 34.0, 30.0 )];
11        abbreviation.tag = ABBREVIATION; 
12        abbreviation.font = [UIFont fontWithName:@"Helvetica-Bold" size:20.0];
13        abbreviation.textAlignment = UITextAlignmentLeft;
14        abbreviation.textColor = [UIColor blackColor];
15
16        state = [[UILabel alloc] initWithFrame:CGRectMake(42.0, 1.0, 158.0, 30.0)];
17        state.tag = STATE;
18        state.font = [UIFont fontWithName:@"Helvetica-Bold" size:20.0];
19        state.textAlignment = UITextAlignmentLeft;
20        state.textColor = [UIColor blackColor];
21
22        [cell.contentView addSubview:abbreviation];
23        [cell.contentView addSubview:state];
24    
25        [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
26        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
27    }
28    
29    abbreviation.text = [[self.primaries objectAtIndex:indexPath.row] objectForKey:@"abbreviation"];
30    state.text = [[self.stateInfo objectAtIndex:indexPath.row] objectForKey:@"name"];
31    
32    return cell;

按照 2994472 中的建议,我将第 27 行和第 28 行修改为使用三元运算符。

29   abbreviation.text = [[self.primaries objectAtIndex:indexPath.row] objectForKey:@"abbreviation"] ?
                         [[self.primaries objectAtIndex:indexPath.row] objectForKey:@"abbreviation"] :
                         @"";

30   state.text = [[self.stateInfo objectAtIndex:indexPath.row] objectForKey:@"name"] ?
                  [[self.stateInfo objectAtIndex:indexPath.row] objectForKey:@"name"] : 
                  @"";

那没有用,重复仍然从第 8 行开始发生。

似乎解决问题的方法是在设置标签文本以深入查看实际子视图时引用 UILabel 标记。

29  ((UILabel *)[cell viewWithTag:ABBREVIATION]).text = [[self.primaries objectAtIndex:indexPath.row] objectForKey:@"abbreviation"];
30  ((UILabel *)[cell viewWithTag:STATE]).text = [[self.primaries objectAtIndex:indexPath.row] objectForKey:@"name"];

当以这种方式引用单元格子视图时, UITableView 行重复消失。

4

2 回答 2

1

尽管我能够在最初的问题中发布解决方案,但我仍然想知道为什么首先会发生重复单元格的情况。

做了一些额外的研究,写出状态和缩写值的文本值以及单元格中显示的值。

(A) NSLog(@"%@", state.text);
(B) NSLog(@"%@", ((UILabel *)[cell viewWithTag:STATE]).text);

显示的结果很有趣,并对情况有所了解。

 (A)               (B)
 Iowa              Iowa
 New Hampshire     New Hampshire
 South Carolina    South Carolina
 Florida           Florida
 Nevada            Nevada
 Colorado          Colorado
 Minnesota         Minnesota
 (null)            Iowa
 (null)            New Hampshire
 (null)            SouthCarolina
 (null)            Florida

向上滚动以显示其他状态时会出现 (null) 值。

所以我认为正在发生的是当向下滚动发生时,第 29 行和第 30 行中的原始代码尝试设置两个实例变量的文本值。

29    abbreviation.text = [[self.primaries objectAtIndex:indexPath.row] objectForKey:@"abbreviation"];
30    state.text = [[self.stateInfo objectAtIndex:indexPath.row] objectForKey:@"name"];

但由于它们已被 ARC 自动取消引用,它们不再存在,无法设置,并返回 null 值。但是,包含原始值的单元格被“出列”并与旧数据一起重复使用,从而导致出现重复项。

如果我完全不同意这个假设,请告诉我。

于 2011-12-13T01:28:18.123 回答
0

它看起来像dequeueReusableCellWithIdentifier:返回现有表格视图单元格的情况,因此您的if块被跳过,您的abbreviationstate变量未设置。所以在这种情况下(当您开始滚动并因此显示重用单元格时会发生这种情况),abbreviation并且state在您的函数末尾是 nil ,因此重用单元格的标签不会像您期望的那样更新。您可能需要一个else块,在其中设置缩写和状态变量以指向cell.

于 2011-12-04T16:06:20.830 回答