Ответ 1
Установите nil
для идентификатора повторного использования в строке
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
Или просто удалите строку и добавьте
UITableViewCell *cell = nil;
У меня небольшая таблица с фиксированным размером, и я хочу полностью загрузить UITableView в память и никогда не использовать ячейки повторно, если они прокручиваются вне поля зрения. Как достичь этого?
Я не использую UITableViewController; просто UIViewController, который реализует правильные протоколы (UITableViewDataSource и UITableViewDelegate).
Установите nil
для идентификатора повторного использования в строке
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
Или просто удалите строку и добавьте
UITableViewCell *cell = nil;
Просто не реализуйте метод UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SomeID"];
, и ни одна из ваших ячеек не будет повторно использована. Каждый раз, когда он запрашивает ячейку, вы создаете новую и настраиваете ее.
Вы должны передать nil
в методе initWithStyle:reuseIdentifier:
, если вы не хотите повторно использовать ячейки, но имейте в виду производительность. Если это хорошо, вы должны быть в порядке nil
.
Первые три ответа абсолютно правильны, вам просто нужно убедиться, что вы не вызываете функцию dequeueReusableCellWithIdentifier
на UITableView
. В дополнение к этому вы можете просто выделить ячейки в коде. Сначала вам понадобится переменная экземпляра, которая сохранит указатели на ваши ячейки (предположим, вы используете обычный контроллер представления):
@interface MyViewController
@property (nonatomic, strong) NSArray* myTableViewCells;
@end
Затем вы можете лениво создать экземпляр этого массива, переопределив его getter:
- (NSArray *)myTableViewCells
{
if (!_myTableViewCells)
{
_myTableViewCells = @[
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]
];
}
return _myTableViewCells;
}
Добавьте больше элементов в массив, если хотите, или используйте NSMutableArray
. Теперь все, что вам нужно сделать, - подключить этот массив к соответствующим методам UITableViewDataSource
.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.myTableViewCells.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = self.myTableViewCells[indexPath.row];
//
// Add your own modifications
//
return cell;
}
Это делает намного более чистый код, менее подвержен утечкам памяти (статические переменные освобождаются при завершении работы программы, поэтому почему мы сохраняем ячейки таблицы в памяти, если диспетчер представлений, отображающий их, уже исчез?).
Добавление новых ячеек также намного проще (без необходимости использования операторов или операторов), а код более красиво структурирован.
отредактированы
Иногда вам нужно, чтобы некоторые ячейки были статичными, например, вам нужна первая ячейка для загрузки ячейки, у которой есть индикатор выполнения загрузки. и другие ячейки, ожидающие загрузки ячеек. В этом случае первая ячейка должна быть доступна для функций паузы и возобновления (вне tableView: cellForRowAtIndexPath:).
вы можете попытаться создать статические ячейки следующим образом:
1st: подкласс UITableViewCell, чтобы создать свою собственную ячейку (это вариант)
2nd: статическая ячейка ящика в вашем контроллере просмотра
static YourSubclassedTableViewCell *yourCell_0;
static YourSubclassedTableViewCell *yourCell_1;
static YourSubclassedTableViewCell *yourCell_2;
static YourSubclassedTableViewCell *yourCell_3;
3rd: Инициировать ячейки в viewDidLoad (viewDidLoad - хороший выбор для размещения кода инициализации)
- (void)viewDidLoad
{
yourCell_0 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
yourCell_1 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
yourCell_2 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
yourCell_3 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
// or simply
yourCell_0 = [[YourSubclassedTableViewCell alloc] init];
yourCell_1 = [[YourSubclassedTableViewCell alloc] init];
yourCell_2 = [[YourSubclassedTableViewCell alloc] init];
yourCell_3 = [[YourSubclassedTableViewCell alloc] init];
}
4th: Load cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.row) {
case 0:
yourCell_0.textLabel.text = @"1st Row";
return yourCell_0;
case 1:
yourCell_1.textLabel.text = @"2nd Row";
return yourCell_1;
case 2:
yourCell_2.textLabel.text = @"3rd Row";
return yourCell_2;
case 3:
yourCell_3.textLabel.text = @"4th Row";
return yourCell_3;
default:
defaultCell....(ignore)
return defaultCell;
}
}
** Как описано выше, ячейки создаются один раз и могут быть доступны за пределами tableView: cellForRowAtIndexPath:
Вы также можете объявить ячейки как @property, чтобы сделать их доступными для другого класса.
Просто выделите новую ячейку вместо dequeue, не нужно делать что-либо из вышеперечисленного. Последствия для производительности незначительны для небольшого tableView (< 100 ячеек).
Пример в swift 3
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier:"Cell")
return cell
}
Приветствия