UITableViewCell正在被重用,但我找不到原因?

时间:2011-11-16 15:45:32

标签: iphone objective-c ios uitableview

我有一个从数组加载的tableview,由于某种原因,它重新使用了单元格,但第二次在表格下方加载相同的信息。

http://screencast.com/t/Ig8bcqSpLzp

上面的视频可以让您了解我的意思。

这是加载单元格的代码:

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
        accessicon *current =[arryAccess objectAtIndex:indexPath.row] ;
        cell.textLabel.text = current.text;
        cell.imageView.image = [UIImage imageNamed: current.iconPath];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        mySwitch *switchView = [[mySwitch alloc] initWithFrame:CGRectZero];
        cell.accessoryView = switchView;
        switchView.myValue = current.iconValue;

        if(totalIconValue & current.iconValue) {
            [switchView setOn: YES animated:NO];
        } else {
            [switchView setOn: NO animated:NO];

        }

        [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
        [switchView release];


        return cell;


}

任何帮助将不胜感激

编辑:我已经更新了上面的代码,但是在实际设备上它仍然选择了不应该的项目 - 不再重复使用名称,但如果我上下滚动它会选择它们在它自己?

点击此处视频:http://screencast.com/t/a9N1qbws

汤姆

3 个答案:

答案 0 :(得分:3)

此代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
if (cell == nil) {
    ...

从根本上说是错误的。它应该是:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    ...

然后,任何特定于行的内容都应该在if语句之外。

通常,这种模式应该是:

  • 使可重复使用的单元格出现
  • 如果你没有得到一个:
    • 分配新单元格
    • 执行通用单元设置,即适用于所有单元的设置
  • 设置特定行的单元格,然后将其返回。

希望这会有所帮助。

答案 1 :(得分:2)

你没有重复使用细胞。而且只有在init失败时才填充单元格。试试这段代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}

accessicon *current =[arryAccess objectAtIndex:indexPath.row] ;
cell.textLabel.text = current.text;
cell.imageView.image = [UIImage imageNamed: current.iconPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
mySwitch *switchView = [[mySwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchView;
switchView.myValue = current.iconValue;

if(totalIconValue & current.iconValue) {
    [switchView setOn: YES animated:YES];
} else {
    [switchView setOn: NO animated:YES];

}

[switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
[switchView release];

或者在ios5下开发并摆脱alloc和init。

答案 2 :(得分:1)

您不断创建新行,而不是重用旧行。

移动线

    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
在if块内部,除了行

之外,移动你在if块之外的所有其他内容
mySwitch *switchView = [[mySwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchView;

初始化时,您需要为行创建一次开关(即,在if语句中)。我建议您创建它并为其分配一个标记,以便稍后通过其标记访问它。您的代码现在每次使用单元时都会创建一个新的开关,这可能就是开关按这种方式运行的原因。