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

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

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

26
задан Sh'mu'el Cohen 22 June 2011 в 16:49
поделиться

2 ответа

Первые три ответа полностью верны, вам просто нужно убедиться, что вы не вызываете функцию dequeueReusableCellWithIdentifier для UITableView. В дополнение к этому, вы можете просто выделить ячейки в коде. Сначала вам понадобится переменная экземпляра, которая будет хранить указатели на ваши ячейки (я предполагаю, что вы используете обычный контроллер представления):

@interface MyViewController

@property (nonatomic, strong) NSArray* myTableViewCells;

@end

Затем вы можете лениво создать экземпляр этого массива, переопределив его геттер:

- (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
ответ дан 28 November 2019 в 07:22
поделиться

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

Пример в быстрых 3

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

Приветствия

2
ответ дан 28 November 2019 в 07:22
поделиться