2015-07-15 2 views
0

Это тип экрана Делаю: screen 1
Так когда UISwitch изменения состояния он должен изменить метку ON или OFF. В моем cellForRowAtIndexPath я звоню [cell.mainSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; и switchChanged выглядит следующим образом:UISwitch в CustomCell не изменяя значения в конкретной indexpath

-(void) switchChanged:(id)sender { 
    UISwitch* cellNew = (UISwitch*)sender; 

     if ([cellNew isOn]) { 
      cell.funcStatus.text = [funcStatusArr objectAtIndex:0]; 
     } else { 
      cell.funcStatus.text = [funcStatusArr objectAtIndex:1]; 
     } 
} 

Теперь проблема я столкнулся в том, что она не меняет Label на конкретной ячейки приклад все переключатели меняют этикетки на 4 (последней), как показано на рисунке ниже. problem
Как вы можете видеть, первая метка выключена, но она меняет метку последней строки. Любые идеи, почему это происходит или как сообщить функции, которые этот index.row отправляет запрос.

+0

Похоже, что вы ссылаетесь на последнюю ячейку в ячейке, и приложение правильно обновляет метку, тогда проблема связана с тем, как вы устанавливаете или не устанавливаете значение «cell». –

+0

u должен создать ячейку для текущей indexPath. в вашем случае всегда изменяется только последняя ячейка. –

+0

@ Константин Крыжановский, вы можете показать мне пример, пожалуйста! –

ответ

1

Таким образом, вы должны добавить tag недвижимость для всех UISwitch. Постников способ его в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath вызова

// code 
// its good work if u have only 1 section 
mySwitch.tag = indexPath.row. 
//code 

Чем исправить u're код

-(void) switchChanged:(UISwitch*)switch { 
    SettingsTableViewCell *selectedCell; 
    NSIndexPath *selectedIndexPath; 
    if(switch.tag == 0) 
     // create selectedIndexPath with correctrly row and section 
     selectedIndexPath = [NSIndexPath indexPathForRow:'YourRow'inSection:'Your section'] 
     // create cell 
     selectedCell = [self.tableView cellForIndexPath:selectedIndexPath]; 
    } else if(switch.tag == 1) { 
     // same logic; 
    } 

    // and replace text for selected cell 
    if ([switch isOn]) { 
     selectedCell.funcStatus.text = [funcStatusArr objectAtIndex:0]; 
    } else { 
     selectedCell.funcStatus.text = [funcStatusArr objectAtIndex:1]; 
    } 
} 

это должно работать.

+0

Вы использовали 'UITableViewCell * selectedCell', но я использую специальную ячейку' SettingsTableViewCell * cell; 'так что остальное в порядке, но когда дело доходит до последнего патла, я не могу выполнить' selectedCell.funcStatus.text', потому что он находится в 'cell .funcStatus.text' –

+1

, поэтому замените 'UITableViewCell' на' SettingsTableViewCell'. –

1

Вы делаете неправильную вещь. Сначала вам нужно получить ячейку при определенном измененном событии. следуйте этому коду.

-(void) switchChanged:(id)sender { 



    UISwitch* switchBtn = (UISwitch*)sender; 
    //self.tableView is UITableView's outlet named tableView 
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition]; 
    //First detect Tableview's Cell then do the stuff 
    //CustomCellTableViewCell replace it with you custom cell class 
    CustomCellTableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    if ([switchBtn isOn]) { 
     cell.funcStatus.text = [funcStatusArr objectAtIndex:0]; 
    } else { 
     cell.funcStatus.text = [funcStatusArr objectAtIndex:1]; 
    } 
    [self.tableView reloadRowsAtIndexPaths:[[NSArray alloc] initWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone]; 


} 

Cheers.

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