UIswitch表格单元格重复使用(UIswitch in a table cell reused)

2019-09-01 03:36发布

我有uiswitch一个问题,我UITableViewCell ,每当我在一个特定的细胞改变开关值属于特定部分。 其他所有的部分细胞具有相同inexPath.row变化。 请帮忙 ?

这里是我的代码cellForRowAtIndexPath方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //UISwitch *switchview = nil ;

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];



    }


    UISwitch *switchController = [[UISwitch alloc] initWithFrame:CGRectZero];
    CGRect switchFrame = switchController.frame;
    NSString *str = [[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    NSLog(@"string in cell%@", str);


    //set its x and y value, this you will have to determine how to space it on the left side
    switchFrame.origin.x = 50.0f;
    switchFrame.origin.y = 10.0f;
    switchController.frame = switchFrame;


    [switchController addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
    [cell addSubview:switchController ];
    [addSubview:switchController];


    if ([[[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row ]isEqualToString:@"ON"])
 {
        switchController.on=YES;
 }
    else
    {
        switchController.on=NO;
    }


    return cell;

}

这里是SwitchChangedEvent:

-(void)switchChanged:(UISwitch *)sender
{
    UITableViewCell *cell = (UITableViewCell *)[sender superview];
    NSIndexPath *index=[mainTableView indexPathForCell:cell];

    if (sender.on)
    {

        [[self.SwitchArray objectAtIndex:index.section] replaceObjectAtIndex:index.row withObject:@"ON"];
        NSString *word= [[self.mainArray objectAtIndex:index.section ] objectAtIndex:index.row];

    }
    else
    {
        //call the first array by section
        [[self.SwitchArray objectAtIndex:index.section] replaceObjectAtIndex:index.row withObject:@"OFF"];
        NSString *word= [[self.mainArray objectAtIndex:index.section ] objectAtIndex:index.row];


   }

    [padFactoids setObject:[NSKeyedArchiver archivedDataWithRootObject:SwitchArray] forKey:@"savedArray"];
    [padFactoids synchronize];

}

Answer 1:

你有两个主要问题:

  1. 这段代码是错误的:

      [cell addSubview:switchController ]; 

    绝不添加一个子视图到细胞; 它仅添加到单元格的contentView

  2. 您每次通过添加开关cellForRowAtIndexPath: 但是,这些细胞被重用。 因此,一些细胞已经具备了开关。 因此,你要添加很多切换到一些细胞。



Answer 2:

正如所指出的其他人,您要添加多个交换机的每个细胞。 FTFY:

UISwitch *switchController = nil;
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];
    switchController = [[UISwitch alloc] initWithFrame:CGRectZero];
    switchController.tag = 'swch';
    CGRect switchFrame = switchController.frame;
    //set its x and y value, this you will have to determine how to space it on the left side
    switchFrame.origin.x = 50.0f;
    switchFrame.origin.y = 10.0f;
    switchController.frame = switchFrame;
    [switchController addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
    [cell.contentView addSubview:switchController];
}
else 
{
    switchController = (UISwitch*)[cell.contentView viewWithTag: 'swch'];
    NSAssert(switchController != nil, @"how?");
}

NSString *str = [[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
NSLog(@"string in cell%@", str);

switchController.on = [str isEqualToString:@"ON"];

return cell;


Answer 3:

如果你看看,我想你会发现你正在建立多个交换机和每个细胞。

随着细胞得到重用,你添加一个新的开关,但不删除旧的。 我想,这我是你的问题的原因至少一部分。


UPDATE

我想我会这不同的处理有点比其他人。 我认为这将是更容易@AlanoudAldrees删除旧的开关。

if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];
}
else
{
    for (UIView *view in cell.subviews)
        if ([view isKindOfClass:[UISwitch class]])
            [view removeFromSuperview];
}


文章来源: UIswitch in a table cell reused