2013-07-14 2 views
1

Я подклассифицировал UITableViewCell для отображения чисел от 1 до 70. В каждой ячейке я проверяю выигрышные номера и шанс их фона. Проблема в том, что после нескольких прокруток табличный вид становится очень медленным, чтобы его нельзя было использовать. Я не понимаю, почему, поскольку, насколько я понимаю, я повторно использую ячейки. Может быть, это потому, что я каждый раз создаю 70 UITextFields?cellForRowAtIndexPath медленно поворачивается после нескольких прокруток

Пожалуйста посоветуйте

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
     ... 

     ... 

     ... 

     SubCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
     if (cell == nil) { 
      cell = [[SubCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"]; 
     } 

     for(int i=0;i<7;i++) 
     { 
      for(int j=0;j<10;j++) 
      { 
       UITextField *tempField = [[UITextField alloc]initWithFrame:CGRectMake(2+(j*31), 4+(i*28), 30, 27)]; 
       [tempField setBorderStyle:UITextBorderStyleNone]; 
       [tempField setOpaque:YES]; 
       [tempField setTextAlignment:NSTextAlignmentCenter]; 
       [tempField setTextColor:[UIColor whiteColor]]; 
       [tempField setUserInteractionEnabled:NO]; 
       tempField.text = [NSString stringWithFormat:@"%d",i*10+j+1]; 
       if([[cell.currentWinningArray objectAtIndex:i*10+j] isEqualToString:@"0"]) 
       { 
        [tempField setBackground:[UIImage imageNamed:@"blue"]]; 
       } 
       else 
        [tempField setBackground:[UIImage imageNamed:@"orange"]]; 

       [cell.contentView addSubview:tempField]; 
      } 
     } 
     return cell; 
    } 

ответ

3

Причины ваши клетки становятся медленно на повторном использовании является то, что вы продолжаете добавлять подвиды на них даже после многократного использования клетки. Каждый раз, когда ячейка создается или используется повторно, вы добавляете к ней 70 подпрограмм, но вы никогда не удаляете подпункты. Вы не видите «старые» подпункты из повторно используемых ячеек, потому что недавно добавленные subviews сидят поверх них, но старые subviews все еще существуют.

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

Одним из способов достижения этой цели будет давать каждому tempField тэге между 0 и 69, как это:

SubCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
if (cell == nil) { 
    cell = [[SubCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"]; 
    for(int i=0;i<7;i++) 
    { 
     for(int j=0;j<10;j++) 
     { 
      UITextField *tempField = [[UITextField alloc]initWithFrame:CGRectMake(2+(j*31), 4+(i*28), 30, 27)]; 
      [tempField setBorderStyle:UITextBorderStyleNone]; 
      [tempField setOpaque:YES]; 
      [tempField setTextAlignment:NSTextAlignmentCenter]; 
      [tempField setTextColor:[UIColor whiteColor]]; 
      [tempField setUserInteractionEnabled:NO]; 
      [tempField setTag:10*i+j]; 
      [cell.contentView addSubview:tempField]; 
     } 
    } 
} 
for(int i=0;i<7;i++) 
{ 
    for(int j=0;j<10;j++) 
    { 
     UITextField *tempField = [cell subviewWithTag:10*i+j]; 
     tempField.text = [NSString stringWithFormat:@"%d",i*10+j+1]; 
     if([[cell.currentWinningArray objectAtIndex:i*10+j] isEqualToString:@"0"]) 
     { 
      [tempField setBackground:[UIImage imageNamed:@"blue"]]; 
     } 
     else 
     { 
      [tempField setBackground:[UIImage imageNamed:@"orange"]]; 
     } 
    } 
} 
return cell; 
+0

делает много смысла. Благодарю. Не могли бы вы рассказать мне, в чем причина того, что моя клетка никогда не ноль? Он никогда не войдет первым, если. – Segev

+0

@Sha Это [вероятно, потому, что вы используете раскадровку и дали свой 'UITableViewCell' идентификатор' 'myCell''] (http://stackoverflow.com/a/11788323/335858). – dasblinkenlight

+0

После некоторого чтения я узнал, что, поскольку я использую ячейки прототипа, я не могу использовать все 'cell == nil'. Короткий ответ, который объясняет это: http://stackoverflow.com/a/9461518/1578927. Отличный ответ и приводит @dasblinkenlight. Благодаря! – Segev

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