xCode 4.2将UISwitch分配给一个部分的一行会产生奇怪的行为...... IOS

时间:2012-03-27 18:18:37

标签: ios xcode4.2 uiswitch

我正在创建一个设置页面,并希望第一部分的第一行有一个UISwitch。我使用以下代码实现了这一目标:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }

    if (indexPath.section == 0){
        [[cell textLabel] setText:[table1labels objectAtIndex:indexPath.row]];
        if (indexPath.row == 0 && indexPath.section == 0){
            UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = switchview;
        }else{
            [[cell detailTextLabel] setText:@"test"];
        }
    }else{
        [[cell textLabel] setText:[table2labels objectAtIndex:indexPath.row]];
        [[cell detailTextLabel] setText:@"test"];
    }

    return cell;
}

页面加载时,第一部分的第一行有一个UISwitch,其他所有部分都说“test”。但是,当我在页面上滚动时,会有更多的UISwitch随机出现。它们不会替换文本“test”,而只是将其推到左侧。它不会发生在每一个人身上。当一个单元格离开视图并返回到视图时,只需随机。有谁能告诉我如何解决这个问题?

我只在5.1模拟器上测试过它。尚未在实际设备上。这可能只是一个模拟器问题吗?

1 个答案:

答案 0 :(得分:2)

您不断重复使用同一个单元格,这是您问题的重要部分。

现在假设最初用于UISwitch的单元格被重用于索引,该索引不等于您想要显示的索引。对于这种情况,您必须手动隐藏或替换UISwitch。

作为替代方案,我强烈建议您为实际看起来不相似的单元格使用不同的单元格标识符。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier;
    if (indexPath.row == 0 && indexPath.section == 0)
    {
        cellIdentifier = @"CellWithSwitch";
    }
    else
    {
        cellIdentifier = @"PlainCell";
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
    }

    if (indexPath.section == 0)
    {
        [[cell textLabel] setText:[table1labels objectAtIndex:indexPath.row]];
        if (indexPath.row == 0 && indexPath.section == 0)
        {
            UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = switchview;
        }
        else
        {
            [[cell detailTextLabel] setText:@"test"];
        }
    }else{
        [[cell textLabel] setText:[table2labels objectAtIndex:indexPath.row]];
        [[cell detailTextLabel] setText:@"test"];
    }

    return cell;
}