У меня проблема с моим UISwitch
внутри UITableViewCell
. Когда я изменяю значение одного переключателя, тогда прокрутка вверх или вниз все переключатели перепутаны. Я использую массив для хранения состояния для каждого коммутатора из-за повторного использования, которое они все еще испортили каждый раз.Uiswitch в uitableviewcell сбрасывается при прокрутке вверх или вниз?
Вот cellForRowAtIndexPath
метод:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"Cell"];
}
UISwitch *switchController = [[UISwitch alloc] initWithFrame:CGRectZero];
CGRect switchFrame = switchController.frame;
[switchController setOn:YES animated:NO];
//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 ];
UILabel *label ;
label=(UILabel *)[cell viewWithTag:1];
NSString *value = [[mainArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
label.text = value;
label.textAlignment = NSTextAlignmentRight;
label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
//This for persist switch state when scroll up or down
if ([[[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row ]isEqualToString:@"ON"])
{
switchController.on=YES;
}
else
{
switchController.on=NO;
}
return cell;
}
Вот SwitchChanged событие:
-(void)switchChanged:(UISwitch *)sender
{
UITableViewCell *cell = (UITableViewCell *)[[sender superview] 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];
}
Я ценю вашу помощь так много.
Попробуйте установить точку останова и посмотреть на 'self.SwitchArray', чтобы убедиться, что он существует (не' nil') и содержит данные, которые вы ожидаете. Предполагаю, что ваши массивы будут 'nil', поэтому ваши возвратные переключатели будут отключены все время. – DBD
@DBD, чем вы для вашего ответа. но я имею в виду, что не все переключатели выключены. Я имею в виду, что всякий раз, когда я меняю один из переключателей на табличном представлении, а затем прокручивайте вверх или вниз, они становятся беспорядочными, один из них выключен, чтобы быть включенным и наоборот. – user2323070
Как упоминалось в ChrisH, вы создаете новый 'UISwitch' каждый раз, когда вы настраиваете ячейку, даже если переключатель уже существует. Это то, что вам придется исправить, но я все же думаю, что вам нужно будет проверить модель данных, потому что я не уверен, что ваши ценности сохраняются в них, как вы думаете, они должны быть. – DBD