Подтвердить что ты не робот

Отключить повторное использование ячеек для небольшого UITableView с фиксированным размером

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

Я не использую UITableViewController; просто UIViewController, который реализует правильные протоколы (UITableViewDataSource и UITableViewDelegate).

4b9b3361

Ответ 1

Установите nil для идентификатора повторного использования в строке

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

Или просто удалите строку и добавьте

UITableViewCell *cell = nil;

Ответ 2

Просто не реализуйте метод UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SomeID"];, и ни одна из ваших ячеек не будет повторно использована. Каждый раз, когда он запрашивает ячейку, вы создаете новую и настраиваете ее.

Ответ 3

Вы должны передать nil в методе initWithStyle:reuseIdentifier:, если вы не хотите повторно использовать ячейки, но имейте в виду производительность. Если это хорошо, вы должны быть в порядке nil.

Ответ 4

Первые три ответа абсолютно правильны, вам просто нужно убедиться, что вы не вызываете функцию 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;
}

Это делает намного более чистый код, менее подвержен утечкам памяти (статические переменные освобождаются при завершении работы программы, поэтому почему мы сохраняем ячейки таблицы в памяти, если диспетчер представлений, отображающий их, уже исчез?).

Добавление новых ячеек также намного проще (без необходимости использования операторов или операторов), а код более красиво структурирован.

Ответ 5

отредактированы

Иногда вам нужно, чтобы некоторые ячейки были статичными, например, вам нужна первая ячейка для загрузки ячейки, у которой есть индикатор выполнения загрузки. и другие ячейки, ожидающие загрузки ячеек. В этом случае первая ячейка должна быть доступна для функций паузы и возобновления (вне 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, чтобы сделать их доступными для другого класса.

Ответ 6

Просто выделите новую ячейку вместо dequeue, не нужно делать что-либо из вышеперечисленного. Последствия для производительности незначительны для небольшого tableView (< 100 ячеек).

Пример в swift 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier:"Cell")
    return cell
}

Приветствия