2

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

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

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

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

4

3 回答 3

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")];
}
于 2013-04-12T19:12:35.630 回答
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];
于 2013-04-12T19:13:52.487 回答
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;
于 2013-04-12T19:25:44.503 回答