2013-09-13 2 views
2

Я прочитал много вопросов и опробовал решения, но я все еще не мог решить проблему с моим tableview.Данные внутри табличного представления смешаны после прокрутки

После прокрутки данные в строках табличного вида были взаимозаменяемы и иногда отсутствуют.

Вот мой код:

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

    BGMModifierCheckCell *cell = nil; 
    cell = (BGMModifierCheckCell *)[tableView dequeueReusableCellWithIdentifier:modifierCheckCell]; 

    if (cell == nil) { 

     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:modifierCheckCell owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (BGMModifierCheckCell *)currentObject; 
       break; 
      } 
     } 


     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     NSArray *optionIds = [[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnItem"] objectAtIndex:indexPath.row]; 

     BGMOptnCats *optnCat = [BGMOptnCats MR_findFirstByAttribute:@"iOptnCatId" withValue:[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnCatId"]]; 

     [optionIds enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

      __block int optnTag = [obj intValue]; 

      BGMItemDayOptns *item = [BGMItemDayOptns MR_findFirstByAttribute:@"iItemDayOptnId" withValue:obj]; 

      [item.optns.optnLangs enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 

       BGMOptnLangs *lang = (BGMOptnLangs *)obj; 

       if ([lang.sLangCode isEqualToString:@"en"]) { 

        NSString *optn = [NSString stringWithFormat:@"%@", lang.sOptnName]; 

        if ([optnCat.sOptnType isEqualToString:@"single"]) { 

         RadioButton *rb1     = [[RadioButton alloc] initWithFrame:CGRectMake(0, 0, 200, 40)]; 
         [rb1 setGroupID:indexPath.section AndID:optnTag AndTitle:optn]; 
         rb1.delegate     = self; 

         if (idx == 0) { 

          [cell.firstOption addSubview:rb1]; 

         } else if (idx == 1) { 

          [cell.secondOption addSubview:rb1]; 

         } else if (idx == 2) { 

          [cell.thirdOption addSubview:rb1]; 

         } 


        } else if ([optnCat.sOptnType isEqualToString:@"multiple"]) { 

         SSCheckBoxView *checkBox = [[SSCheckBoxView alloc] initWithFrame:CGRectMake(0, 0, 200, 40) style:kSSCheckBoxViewStyleMono checked:NO]; 
         checkBox.tag = optnTag; 
         [checkBox setStateChangedTarget:self selector:@selector(checkBoxViewChangedState:)]; 
         [checkBox setText:@""]; 
         [checkBox setText:optn]; 

         if (idx == 0) { 

          [cell.firstOption addSubview:checkBox]; 

         } else if (idx == 1) { 

          [cell.secondOption addSubview:checkBox]; 

         } else if (idx == 2) { 

          [cell.thirdOption addSubview:checkBox]; 

         } 


        } 

       } 

      }]; 

     }]; 

    } 

    return cell; 

} 
+1

Я не знаю, если это поможет, т.к. вы сказали в своем комментарии ниже, что вы попытались переместить код вне блока if cell == nil, но вы не должны использовать это предложение if вообще. Вы должны зарегистрировать свой nib (в viewDidLoad) с помощью registerNib: forCellReuseIdentifier :, а затем удалить предложение if cell == nil, потому что ячейка никогда не будет равна нулю, когда вы это сделаете. – rdelmar

+0

@rdelmar, я решил проблему, комментируя if (cell == nil). Но я не удалял коды внутри оператора if. Я не добавил registerNib: forCellReuseIdentifier: внутри viewDidLoad, могу я знать, почему это необходимо? –

+0

Это новый, и я думаю, что более эффективный способ загрузки ячеистой ячейки. Вам не нужно использовать его, но, вынимая предложение if cell == nil и оставляя в коде загрузки nib, вы можете загружать nib много раз (я не знаю, есть ли какая-либо оптимизация, которую делает система для предотвращения этого). – rdelmar

ответ

0

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

Задайте содержимое ячейки вне if (cell == nil).

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

    BGMModifierCheckCell *cell = nil; 
    cell = (BGMModifierCheckCell *)[tableView dequeueReusableCellWithIdentifier:modifierCheckCell]; 

    if (cell == nil) { 

     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:modifierCheckCell owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (BGMModifierCheckCell *)currentObject; 
       break; 
      } 
     } 
    } 


     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     NSArray *optionIds = [[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnItem"] objectAtIndex:indexPath.row]; 

     BGMOptnCats *optnCat = [BGMOptnCats MR_findFirstByAttribute:@"iOptnCatId" withValue:[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnCatId"]]; 

     [optionIds enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

      __block int optnTag = [obj intValue]; 

      BGMItemDayOptns *item = [BGMItemDayOptns MR_findFirstByAttribute:@"iItemDayOptnId" withValue:obj]; 

      [item.optns.optnLangs enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 

       BGMOptnLangs *lang = (BGMOptnLangs *)obj; 

       if ([lang.sLangCode isEqualToString:@"en"]) { 

        NSString *optn = [NSString stringWithFormat:@"%@", lang.sOptnName]; 

        if ([optnCat.sOptnType isEqualToString:@"single"]) { 

         RadioButton *rb1     = [[RadioButton alloc] initWithFrame:CGRectMake(0, 0, 200, 40)]; 
         [rb1 setGroupID:indexPath.section AndID:optnTag AndTitle:optn]; 
         rb1.delegate     = self; 

         if (idx == 0) { 

          [cell.firstOption addSubview:rb1]; 

         } else if (idx == 1) { 

          [cell.secondOption addSubview:rb1]; 

         } else if (idx == 2) { 

          [cell.thirdOption addSubview:rb1]; 

         } 


        } else if ([optnCat.sOptnType isEqualToString:@"multiple"]) { 

         SSCheckBoxView *checkBox = [[SSCheckBoxView alloc] initWithFrame:CGRectMake(0, 0, 200, 40) style:kSSCheckBoxViewStyleMono checked:NO]; 
         checkBox.tag = optnTag; 
         [checkBox setStateChangedTarget:self selector:@selector(checkBoxViewChangedState:)]; 
         [checkBox setText:@""]; 
         [checkBox setText:optn]; 

         if (idx == 0) { 

          [cell.firstOption addSubview:checkBox]; 

         } else if (idx == 1) { 

          [cell.secondOption addSubview:checkBox]; 

         } else if (idx == 2) { 

          [cell.thirdOption addSubview:checkBox]; 

         } 


        } 

       } 

      }]; 

     }]; 

    return cell; 

}
+0

Благодарю вас за ответ. Я тоже пробовал эту проблему, и та же проблема существует. –

0

вам нужно удалить свои подвидов, потому что каждый раз, когда CellForRowAtIndexpath называется это создаст подвид так, прежде чем добавить новую подтаблицу удалить предыдущий

for (UIView *view in cell.contentView.subviews) { 
        [view removeFromSuperview]; 
       } 
Смежные вопросы