2013-10-26 2 views
1

Мое UITableViewCell позиция изменена во время прокрутки UITableView. Здесь у меня больше UITableViewCell. Таким образом, он охватывает более одного экрана страницы. Когда я прокручиваю сверху вниз, позиция UITableViewCell изменяется, например, 1-я ячейка заняла 5-е место. И вторая ячейка пришла к 1-й и т.д.Изменение позиции UITableViewCell во время прокрутки UITableView

Мой код:

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

    static NSString *CellIdentifier = @"SignUpWithEmailCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    cell.backgroundColor = [UIColor clearColor]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    switch (indexPath.row) { 

     case 0: { 

      UILabel *lblFirstName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)]; 
      lblFirstName.text = @"First Name"; 
      [cell.contentView addSubview:lblFirstName]; 

      self.txtFirstName = [[UITextField alloc]initWithFrame:CGRectMake(lblFirstName.frame.origin.x + lblFirstName.frame.size.width + 5, 0, 190, 40)]; 
      self.txtFirstName.delegate = self; 
      self.txtFirstName.text = strFirstName; 
      self.txtFirstName.tag = 0; 
      self.txtFirstName.userInteractionEnabled = YES; 
      self.txtFirstName.font = [UIFont systemFontOfSize:15.0]; 
      self.txtFirstName.clearButtonMode = UITextFieldViewModeWhileEditing; 
      self.txtFirstName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
      [cell.contentView addSubview:self.txtFirstName]; 
      break; 
     } case 1: { 

      UILabel *lblLastName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)]; 
      lblLastName.text = @"Last Name"; 
      [cell.contentView addSubview:lblLastName]; 

      self.txtLastName = [[UITextField alloc]initWithFrame:CGRectMake(lblLastName.frame.origin.x + lblLastName.frame.size.width + 5, 0, 190, 40)]; 
      self.txtLastName.backgroundColor = [UIColor clearColor]; 
      self.txtLastName.delegate = self; 
      self.txtLastName.tag = 1; 
      self.txtLastName.text = strLastName; 
      self.txtFirstName.userInteractionEnabled = YES; 
      self.txtLastName.returnKeyType = UIReturnKeyDone; 
      self.txtLastName.clearButtonMode = UITextFieldViewModeWhileEditing; 
      self.txtLastName.font = [UIFont systemFontOfSize:15.0]; 
      self.txtLastName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
      [cell.contentView addSubview:self.txtLastName]; 
      break; 
     } 
     default: 
      break; 
    } 
} 

return cell; 
} 

Можно ли направить меня в архив правильно ..

Заранее спасибо.

ответ

1

это вы проблема if (cell == nil) в первый раз, что клетка является нолем я сделать ячейку, то я пытаюсь повторно-де-клеточной клетки является не нулевой, так что я не добавить эту ячейку, как это было раньше, не вносить никаких изменений , для решения проблемы вам нужно удалить if, а для утечки лучше не создавать пользовательскую ячейку со всем объектом в ней.

+0

Я удалил 'if (cell == nil)' loop. Теперь он работает отлично. Но у меня есть одно сомнение. Является ли UITableViewCell постоянно создаваться при прокрутке? Будет ли отображаться некоторые предупреждения о памяти? –

+0

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

+0

K. Я внесу изменения. Спасибо за ваш ответ .. –

1

Вы должны установить визуальные элементы ячейки, даже если ячейка не равна нулю. Если вы прочтете документацию, вы заметите, что Apple говорит, что контент этой ячейки всегда должен быть обновлен в этом методе. Причина в том, что проверка нулевого теста просто необходима, если вы должны создать новую ячейку. Если вам не нужно создавать новую ячейку, это означает, что вы повторно используете ячейку, и поэтому она скорее всего отобразит содержимое из строки, отличной от той, которую вы намеревались. Поэтому вы должны каждый раз переустанавливать содержимое этого метода.

От this document:

источник данных Реализация табличного представления о Tableview: cellForRowAtIndexPath: должны всегда сбросить все содержимое при повторном использовании ячейки.

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

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

    static NSString *CellIdentifier = @"SignUpWithEmailCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     cell.backgroundColor = [UIColor clearColor]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    switch (indexPath.row) { 

     case 0: { 

      UILabel *lblFirstName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)]; 
      lblFirstName.text = @"First Name"; 
      [cell.contentView addSubview:lblFirstName]; // TODO: MUST BE MOVED 

      self.txtFirstName = [[UITextField alloc]initWithFrame:CGRectMake(lblFirstName.frame.origin.x + lblFirstName.frame.size.width + 5, 0, 190, 40)]; 
      self.txtFirstName.delegate = self; 
      self.txtFirstName.text = strFirstName; 
      self.txtFirstName.tag = 0; 
      self.txtFirstName.userInteractionEnabled = YES; 
      self.txtFirstName.font = [UIFont systemFontOfSize:15.0]; 
      self.txtFirstName.clearButtonMode = UITextFieldViewModeWhileEditing; 
      self.txtFirstName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
      [cell.contentView addSubview:self.txtFirstName]; // TODO: MUST BE MOVED 
      break; 
     } case 1: { 

      UILabel *lblLastName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)]; 
      lblLastName.text = @"Last Name"; 
      [cell.contentView addSubview:lblLastName]; // TODO: MUST BE MOVED 

      self.txtLastName = [[UITextField alloc]initWithFrame:CGRectMake(lblLastName.frame.origin.x + lblLastName.frame.size.width + 5, 0, 190, 40)]; 
      self.txtLastName.backgroundColor = [UIColor clearColor]; 
      self.txtLastName.delegate = self; 
      self.txtLastName.tag = 1; 
      self.txtLastName.text = strLastName; 
      self.txtFirstName.userInteractionEnabled = YES; 
      self.txtLastName.returnKeyType = UIReturnKeyDone; 
      self.txtLastName.clearButtonMode = UITextFieldViewModeWhileEditing; 
      self.txtLastName.font = [UIFont systemFontOfSize:15.0]; 
      self.txtLastName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
      [cell.contentView addSubview:self.txtLastName]; // TODO: MUST BE MOVED 
      break; 
     } 
     default: 
      break; 
    } 


return cell; 
} 
+0

Я тоже пробовал это. Но положение ячейки изменилось при прокрутке. –

0

Для оптимизации памяти iOS инициализирует и использует только отображаемые на экране ячейки. Когда вы просматриваете следующий контент, он деактивирует невидимую ячейку и использует ее для новой видимой ячейки. Итак, 1-я ячейка используется в 8-й строке и так далее. Теперь, в вашем коде, вы не сбрасываете содержимое, когда эта операция удаления происходит. Весь ваш код содержимого ячейки только тогда, когда ячейки нет. Выньте код инициализации ячейки из вашего условия IF, и вам должно быть хорошо идти.

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