我对UISwitch更改的事件值有疑问,这是我的问题。
在numberOfRowsInSection中的我有一个循环,它调用一个数据库方法,返回每个部分的#of行。
我使用了一个数组数组(因为我有很多行的多个部分),它保持UISwitch的状态,然后在调用值更改时更新它,这里是事件的代码:
但是,每当我向上或向下滚动时,所有这些UISwitch仍然会重置。请尽可能地帮助我,我将非常感谢您的帮助。 提前谢谢。
答案 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;