UITableView не повторно использовать ячейки, хороший случай, чтобы сделать это? - PullRequest
6 голосов
/ 29 июня 2011

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

Это плохая идея?

Ответы [ 4 ]

4 голосов
/ 29 июня 2011

У меня есть такая же функция в одном из моих приложений, и я использовал приведенный ниже код для достижения этой цели, и у меня никогда не было подобных проблем.

Прежде всего вам необходимо временно сохранить все значения textField в массиве. Сделайте массив таким.

arrTemp=[[NSMutableArray alloc]initWithObjects:[NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],
         [NSString stringWithFormat:@""],nil];

Тогда передайте все теги textField = indexPath.row;

После этого вам нужно заменить значение textField в двух следующих методах.

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
   [arrTemp replaceObjectAtIndex:textField.tag withObject:textField.text];
}

-(void)textFieldDidEndEditing:(UITextField *)textField{
[arrTemp replaceObjectAtIndex:textField.tag withObject:textField.text];
}

Наконец, вам нужно установить это значение в методе источника данных cellForRowAtIndexPath. Так что всякий раз, когда пользователь прокручивает таблицу, он устанавливает предыдущее значение из временного массива. Вот так.

cell.txtEntry.text = [arrTemp objectAtIndex:indexPath.row];

Возможно, я забыл кое-какой код вставить здесь. Поэтому, если у вас возникнут проблемы, пожалуйста, дайте мне знать.

2 голосов
/ 29 июня 2011

Вы можете присвоить каждой ячейке уникальный ReuseIdentifier, возможно, добавив indexPath.row к имени.Если у вас всего 5 ячеек, это, вероятно, будет хорошо, но вы теряете одно из главных преимуществ UITableView.В этом случае вы можете использовать UIScrollView.

0 голосов
/ 23 декабря 2013

Если вы откроете пример приложения Apple Recipes , вы увидите, как Apple использует файл xib для загрузки UITableViewCells.

В файле IngredientDetailViewController:

@property (nonatomic, assign) IBOutlet EditingTableViewCell *editingTableViewCell;
// ...
[[NSBundle mainBundle] loadNibNamed:@"EditingTableViewCell" owner:self options:nil];
// this will cause the IBOutlet to be connected, and you can now use self.editingTableViewCell

Хотя похоже, что они повторно используют ячейку, вы можете использовать тот же метод для загрузки 5 ячеек в 5 отдельных IBOutlets, а затем в cellForRowAtIndexPath вы просто возвращаете эти 5, а не вызываете метод dequeue.

Примечание: вам, вероятно, нужно будет хранить ячейки как strong свойства (а не assign их).

0 голосов
/ 29 июня 2011

Я бы сказал, что 5 textview - это идеальный вариант для того, чтобы не ставить в очередь и не помещать в очередь ячейки, просто создайте их все на виду, загрузил, сохранил в массиве и вернул в соответствии с запросом.

...