向上和向下滚动时UISwitch重置

时间:2013-04-12 19:04:08

标签: ios objective-c uitableview uiswitch

我对UISwitch更改的事件值有疑问,这是我的问题。

在numberOfRowsInSection中的

我有一个循环,它调用一个数据库方法,返回每个部分的#of行。

我使用了一个数组数组(因为我有很多行的多个部分),它保持UISwitch的状态,然后在调用值更改时更新它,这里是事件的代码:

但是,每当我向上或向下滚动时,所有这些UISwitch仍然会重置。请尽可能地帮助我,我将非常感谢您的帮助。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

我认为你在if (sender.on)方法的-(void)switchChanged:(UISwitch *)sender中出现了逻辑错误,因为当sender.on == YES关闭时:)写

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

    NSMutableArray *repl = [SwitchArray objectAtIndex:x.section];
    [repl replaceObjectAtIndex:x.row withObject:(sender.on ? @"ON", @"OFF")];
}

答案 1 :(得分:1)

您可以仔细检查表格视图willDisplayCell:中的值,以确保您拥有正确的值:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{

    UISwitch* uiSwitch = (UISwitch*) cell.accessoryView;
    if (uiSwitch != nil && [uiSwitch isKindOfClass:[UISwitch class]]) {
        //just make sure it is valid
        NSLog(@"switch value at %d-%d is: %@",indexPath.section, indexPath.row,  [SwitchArray[indexPath.section] objectAtIndex:indexPath.row] );
        uiSwitch.on = [[SwitchArray[indexPath.section] objectAtIndex:indexPath.row] isEqualToString:@"ON"];
    }

}

另外,您可以使用NSNumbers使代码更具可读性:

-(void)switchChanged:(UISwitch *)sender
{
    UITableViewCell *cell = (UITableViewCell *)[sender superview];
    NSIndexPath *x=[mainTableView indexPathForCell:cell];
    NSLog(@"%ld", (long)x.section);

    //NSLog(@"index for switch : %d", switchController.tag );
     NSMutableArray *repl =  repl= [SwitchArray objectAtIndex:x.section];

   repl[x.section]  = @(sender.on);
}

然后在哪里设置on值:

 uiSwitch.on = [[SwitchArray[indexPath.section] objectAtIndex:indexPath.row] boolValue];

答案 2 :(得分:0)

细胞被重复使用。每次使用单元格时,您都在创建一个新的开关。您应该只为每个单元格创建一次开关。请在cellForRow...方法中尝试以下操作:

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

    UISwitch *switchController = [[UISwitch alloc] initWithFrame:CGRectZero];
    [switchController setOn:YES animated:NO];

    [switchController addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
    cell.accessoryView = switchController;
    [switchController release];
}

UISwitch *switch = cell.accessoryView;