我对 UISwitch 的事件值更改有疑问,这是我的详细问题。
在 numberOfRowsInSection 我有循环调用数据库方法,该方法返回每个部分的#of 行。
我使用了一个数组数组(因为我有很多部分和很多行),它保持 UISwitch 的状态,然后在调用值更改时更新它,这是事件的代码:
但是,当我向上或向下滚动时,所有这些 UISwitch 仍然会重置。请尽快帮助我,我将非常感谢您的帮助。先感谢您。
我对 UISwitch 的事件值更改有疑问,这是我的详细问题。
在 numberOfRowsInSection 我有循环调用数据库方法,该方法返回每个部分的#of 行。
我使用了一个数组数组(因为我有很多部分和很多行),它保持 UISwitch 的状态,然后在调用值更改时更新它,这是事件的代码:
但是,当我向上或向下滚动时,所有这些 UISwitch 仍然会重置。请尽快帮助我,我将非常感谢您的帮助。先感谢您。
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")];
}
您可以仔细检查表格视图中的值,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];
细胞被重复使用。每次使用单元时,您都在创建一个新开关。您应该只为每个单元创建一次开关。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;