Deshabilitar la reutilización de celdas para UITableView de tamaño fijo pequeño

Tengo una tabla pequeña, de tamaño fijo, y quiero cargar UITableView completamente en la memory, y nunca reutilizar las celdas si se desplazan fuera de la vista. ¿Cómo logro esto?

No estoy usando un UITableViewController; solo un UIViewController simple que implementa los protocolos adecuados (UITableViewDataSource y UITableViewDelegate).

Establezca nil para el identificador de reutilización en la línea

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 

O simplemente elimine la línea y agregue,

 UITableViewCell *cell = nil; 

Simplemente no implemente el método UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SomeID"]; y ninguna de sus celdas será reutilizada. Cada vez que solicita una celda, crea una nueva y la configura.

Debe pasar nil en el método initWithStyle:reuseIdentifier: si no desea reutilizar las celdas, tenga en count el performance. Siempre y cuando sea bueno, deberías estar bien pasando nil .

Las tres primeras respuestas son completamente correctas, solo debe asegurarse de no llamar a la function dequeueReusableCellWithIdentifier en un UITableView . Además de esto, simplemente puede asignar las celdas en el código. Primero necesitará una variable de instancia que almacene los pointers en sus celdas (supongo que utilizará un controller de vista normal):

 @interface MyViewController @property (nonatomic, strong) NSArray* myTableViewCells; @end 

Entonces puede instanciar perezosamente esta matriz, anulando su getter:

 - (NSArray *)myTableViewCells { if (!_myTableViewCells) { _myTableViewCells = @[ [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil], [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] ]; } return _myTableViewCells; } 

Agregue más celdas a la matriz si lo desea o use NSMutableArray . Ahora todo lo que tiene que hacer es conectar esta matriz a los methods UITableViewDataSource adecuados.

 - (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; } 

Esto hace que el código sea mucho más limpio, less propenso a pérdidas de memory (las variables estáticas se desasignan cuando termina el progtwig, entonces ¿por qué estamos manteniendo las celdas de vista de tabla en la memory si el controller de vista que las muestra ya no existe? ).

La adición de nuevas celdas también es mucho más fácil (no se requiere cambio o si se requieren instrucciones) y el código está más bien estructurado.

EDITADO

A veces necesita que algunas celdas sean estáticas, por ejemplo, necesita la primera celda que downloadá la celda que tiene barra de progreso de descarga. y otras celdas para estar esperando las celdas de descarga. En este caso, la primera celda debe ser accesible para las funciones de pausa y reanudación (fuera de tableView: cellForRowAtIndexPath :).

podrías intentar crear celdas estáticas como esta:

1º: subclass UITableViewCell, para crear su propia celda (esta es una opción)

2do: jaula estática de la jaula en su controller de vista

 static YourSubclassedTableViewCell *yourCell_0; static YourSubclassedTableViewCell *yourCell_1; static YourSubclassedTableViewCell *yourCell_2; static YourSubclassedTableViewCell *yourCell_3; 

3rd: Init cells en viewDidLoad (viewDidLoad es una buena opción para poner el código init)

 - (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]; } 

4º: celda de carga

 - (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; } } 

** Como se describe anteriormente, las celdas se crean una vez y se puede acceder fuera de tableView: cellForRowAtIndexPath:

También podría declarar celdas como @property para que sea accesible para otras classs.

Simplemente asigna una nueva celda en lugar de dequeue sin necesidad de hacer ninguna de las anteriores. Las implicaciones de performance son insignificantes para small tableView (<100 celdas).

Ejemplo en veloz 3

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

Aclamaciones