2013-04-25 6 views
0

У меня проблема с uiswitch в моем UITableViewCell, что всякий раз, когда я изменяю значение переключателя в определенной ячейке, относящейся к определенному разделу. Все остальные ячейки секций, которые имеют одинаковые inexPath.row, меняются. Пожалуйста помоги ?UIswitch в ячейке таблицы повторно используется

Вот мой код cellForRowAtIndexPath метода:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    //UISwitch *switchview = nil ; 

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



    } 


    UISwitch *switchController = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    CGRect switchFrame = switchController.frame; 
    NSString *str = [[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    NSLog(@"string in cell%@", str); 


    //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 ]; 
    [addSubview:switchController]; 


    if ([[[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row ]isEqualToString:@"ON"]) 
{ 
     switchController.on=YES; 
} 
    else 
    { 
     switchController.on=NO; 
    } 


    return cell; 

} 

А вот SwitchChangedEvent:

-(void)switchChanged:(UISwitch *)sender 
{ 
    UITableViewCell *cell = (UITableViewCell *)[sender 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

У вас есть вопросы? – matt

+0

Как выглядит код в 'switchChanged:'? – jszumski

+0

@jszumski вот он: –

ответ

0

Если вы посмотрите, я думаю, вы обнаружите, что вы строите несколько коммутаторов и на каждом клетка.

Поскольку ячейки используются повторно, вы добавляете новый переключатель, но не удаляете старый. Я думаю, что это мое, по крайней мере, часть причины вашей проблемы.


UPDATE

Я думаю, что я бы справиться с этим немного иначе, чем другие. Я думаю, что @AlanoudAldrees будет проще удалить старый переключатель.

if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier]; 
} 
else 
{ 
    for (UIView *view in cell.subviews) 
     if ([view isKindOfClass:[UISwitch class]]) 
      [view removeFromSuperview]; 
} 
+0

Не могли бы вы объяснить больше? Потому что я тоже думаю, что это моя проблема. THANK YOU –

+0

@AlanoudAldrees Я обновил свой ответ. –

3

У вас есть две основные проблемы:

  1. Этот код является неправильным:

    [cell addSubview:switchController ]; 
    

    Никогда не добавляйте подвид в клетку; добавьте его только в ячейку contentView.

  2. Вы добавляете переключатель каждый раз через cellForRowAtIndexPath:. Но эти ячейки повторно используются. Поэтому в некоторых ячейках уже есть есть переключатель. Таким образом, вы добавляете много переключателей в некоторые ячейки.

+0

СПАСИБО за ваш быстрый ответ это много значит. Но не могли бы вы дать мне подробную информацию о том, как решить точку №2? Я буду признателен, что ТАК МОЖНО БЫТЬ ЖИЗНЕННЫМ SAVER –

+0

Вы уже тестируете, является ли это «девственной» ячейкой с 'if (cell == nil)'. Это условие также там, где вам нужно добавить переключатель. Таким образом, если ячейка * not * nil, вы точно знаете, что она имеет переключатель. – matt

+0

Это может помочь вам прочитать мою книгу на эту тему: http://www.apeth.com/iOSBook/ch21.html#_table_view_cells – matt

0

Как уже указывалось другими, вы добавляете несколько переключателей в каждую ячейку. FTFY:

UISwitch *switchController = nil; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier]; 
    switchController = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    switchController.tag = 'swch'; 
    CGRect switchFrame = switchController.frame; 
    //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]; 
} 
else 
{ 
    switchController = (UISwitch*)[cell.contentView viewWithTag: 'swch']; 
    NSAssert(switchController != nil, @"how?"); 
} 

NSString *str = [[self.SwitchArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
NSLog(@"string in cell%@", str); 

switchController.on = [str isEqualToString:@"ON"]; 

return cell; 
+0

Я бы решительно отказался от 'switchController.tag = 'swch''. см. http://stackoverflow.com/questions/7755202/multi-character-constant-warnings –

+0

@JefferyThomas Полезно знать. Хотя, помогите мне понять, почему это плохая идея в данном конкретном случае? Я не вижу здесь никакой переносимости. – Mar0ux

+0

int x = 'xxxx' - это неопределенное поведение в стандарте C (GCC и LLVM имеют определенное для реализации поведение). Реальная проблема, с которой я сталкиваюсь, заключается в том, что скрывает смысл тега. Тег - это число, а не 4 символа. –

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