2015-08-20 2 views
2

Я использую раскадровку и автоматический макет. Я добавляю UISwitch в свою ячейку с тегом 5. Когда я выбираю первый UISwitch и прокручиваю вниз, я вижу, что другой UISwitch также включен, и если я прокрутку вверх, мой первый UISwitch отключается. Как это исправить?UITableView с UISwitch

Мой код:

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



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

    } 


    UISwitch* switchView = (UISwitch *)[cell viewWithTag:5]; 

    [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 

     return cell; 

} 
+1

его из клетки reusablity ... вам нужно хранить indexpath не на swithces и на основе этого заполнить вашу ячейку –

ответ

3

Это происходит потому, что UITableView повторного использования UITableViewCell так одна ячейка может использовать более чем один раз в различных indexPaths, в этой ситуации его ваша ответственность, чтобы сохранить состояние UITableViewCell подпанелей. Лучшее место для этого - cellForRowAtIndexPath, где вы возвращаете логику добавления ячейки, чтобы показать/скрыть UISwitch или выбрать точное состояние, то есть включить или выключить, вы можете сохранить этот флаг в объекте dataSource, а затем вы можете проверить этот флаг, чтобы сделать правильный набор состояние для UISwitch

0

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

Это происходит потому, что UITableViews использует небольшое количество ячеек, которые повторно используются.

В cellForRowAtIndexPath добавить что-то вроде этого:

switchView.on = [self isSwitchOnForCellAtIndexPath:indexPath] 

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

3

Попробуйте:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"CellSetting"; 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
     cell.textLabel.text = [self.settingsArray objectAtIndex:indexPath.row]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

     if ([[self.settingsArray objectAtIndex:indexPath.row] isEqualToString:ROW_PRIVATE_BROWSING]) 
     { 
      self.privateBrowsingSwitch =[[UISwitch alloc]initWithFrame:CGRectMake(cell.frame.size.width-65, 10, 30, 30)]; 
      if (ApplicationDelegate.privateBrowsing) 
      { 
       [self.privateBrowsingSwitch setOn:YES animated:YES]; 
      } 
      [self.privateBrowsingSwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged]; 
      [cell addSubview:self.privateBrowsingSwitch]; 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     return cell; 
    } 
Смежные вопросы