UIswitch сбрасывается при прокрутке вверх и вниз

У меня есть вопрос об изменении значения события для UISwitch, вот моя проблема в деталях.

в numberOfRowsInSection у меня есть цикл, который вызывает метод базы данных, который возвращает количество строк для каждого раздела.

Я использовал массив массивов (ПОТОМУ ЧТО У МЕНЯ ЕСТЬ МНОГИЕ СЕКЦИИ С МНОГИМИ РЯДАМИ), который сохраняет состояние UISwitch, а затем обновляет его всякий раз, когда вызывается изменение значения, вот код события:

ОДНАКО, после всего этого UISwitch все еще сбрасывается всякий раз, когда я прокручиваю вверх или вниз. ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ КАК МОЖНО БЫСТРЕЕ, Я буду ОЧЕНЬ ОЧЕНЬ признательна за вашу помощь. Заранее спасибо.


person Moony    schedule 12.04.2013    source источник
comment
Пожалуйста, избегайте всех формулировок в верхнем регистре и не обращайтесь за помощью как можно скорее.   -  person rmaddy    schedule 12.04.2013


Ответы (3)


Я думаю, что вы делаете логическую ошибку в if (sender.on) в методе -(void)switchChanged:(UISwitch *)sender, потому что когда sender.on == YES вы делаете OFF :) напишите

-(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")];
}
person Vitaly Berg    schedule 12.04.2013

Вы можете дважды проверить значение в представлении таблицы 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];
person Mike Katz    schedule 12.04.2013

Ячейки используются повторно. Вы создаете новый переключатель каждый раз, когда используется ячейка. Вы должны создать переключатель только один раз для каждой ячейки. Попробуйте следующее в своем методе 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;
person rmaddy    schedule 12.04.2013