2013-04-26 6 views
-1

У меня проблема с моим 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]; 

} 

Я ценю вашу помощь так много.

+0

Попробуйте установить точку останова и посмотреть на 'self.SwitchArray', чтобы убедиться, что он существует (не' nil') и содержит данные, которые вы ожидаете. Предполагаю, что ваши массивы будут 'nil', поэтому ваши возвратные переключатели будут отключены все время. – DBD

+0

@DBD, чем вы для вашего ответа. но я имею в виду, что не все переключатели выключены. Я имею в виду, что всякий раз, когда я меняю один из переключателей на табличном представлении, а затем прокручивайте вверх или вниз, они становятся беспорядочными, один из них выключен, чтобы быть включенным и наоборот. – user2323070

+0

Как упоминалось в ChrisH, вы создаете новый 'UISwitch' каждый раз, когда вы настраиваете ячейку, даже если переключатель уже существует. Это то, что вам придется исправить, но я все же думаю, что вам нужно будет проверить модель данных, потому что я не уверен, что ваши ценности сохраняются в них, как вы думаете, они должны быть. – DBD

ответ

0

Я не уверен, вызывает ли это вашу проблему, но это, безусловно, вызовет другие связанные проблемы.

Каждый раз, когда ячейка была сдвинута с экрана, и появляется следующая, тот, который только что покинул экран, будет повторно использован. Но вы каждый раз добавляете новый объект переключателя в ячейку. Вам намного лучше создавать их только в блоке cell==nil. Дайте ему тег и используйте тег для извлечения объекта при повторном использовании, как и для объекта lable.

+0

Спасибо, что это было полезно. Но теперь новая проблема - это то, что моя таблица имеет множество разделов, и каждая из них имеет много строк, когда раздел 0 строка 0 меняет переключатель, а затем все строка 0 во всех разделах изменилась? Вы знаете, почему это происходит? – user2323070

0

Вы создаете новый переключатель каждый раз, когда tableView запрашивает ячейку. Вы только хотите создать переключатель один раз для каждой ячейки:

UISwitch *switchController; 

if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:@"Cell"]; 

    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.contentView addSubview:switchController ]; 

    switchController.tag = 123; //Arbitrary number...can be anything 
} 
else { 
    switchController = (UISwitch *)[cell.contentView viewWithTag:123]; 
} 

//Now set the switch state according to your data model array 

Это также как правило, лучшая практика, чтобы добавить подвидов в contentView клетки, а не самой клетки.

+0

Не могли бы вы рассказать мне, как это сделать? Это мне очень поможет. Спасибо – user2323070

+1

Хороший совет. При распределении нового переключателя есть слишком много «=». И нет смысла вызывать '[switchController setOn: YES animated: NO];' поскольку значение устанавливается позже в любом случае. –

+0

@HermannKlecker да '= =' это моя опечатка.Вы совершенно правы на '[switchController setOn: YES animated: NO];' – ChrisH

1

В вашем файле заголовка объявляется NSMutableArray, назовем его switchStates.

В вашем viewDidLoad, выделить память и добавить объект со строкой «OFF» в зависимости от количества выключателей:

switchStates = [[NSMutableArray alloc] init]; 
for (int i; i <= switchesArray.count; i++) { 
    [switchStates addObject:@"OFF"]; 
} 

В вашем методе, который работает, когда переключатель срабатывает:

NSString *theSwitchPosition = [NSString stringWithFormat:@"%@", switchControl.on ? @"ON" : @"OFF"]; 
[switchStates replaceObjectAtIndex:aPath.row withObject:theSwitchPosition]; 

После этого в методе, в котором вы создаете свои переключатели:

if ([[switchStates objectAtIndex:indexPath.row] isEqualToString:@"ON"]) { 
    mySwitch.on = YES; 
} else { 
    mySwitch.on = NO; 
} 

Это w orked для меня, удачи ..

Смежные вопросы