iphone objective-c ios uitableview

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



objective-c ios (6)

Debe pasar nil en el método initWithStyle:reuseIdentifier: si no desea reutilizar las celdas, tenga en cuenta el rendimiento. Mientras sea bueno, deberías estar bien pasando nil .

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

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


Editado

A veces necesita que algunas celdas sean estáticas, por ejemplo, necesita la primera celda para descargar la celda que tiene la barra de progreso de descarga. y otras celdas estarán esperando 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:

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

2: caja de la celda estática en su controlador de vista

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

3º: celdas de inicio en viewDidLoad (viewDidLoad es una buena opción para poner el código de inicio)

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

4to: 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 describió anteriormente, las celdas se crean una vez y se puede acceder desde tableView: cellForRowAtIndexPath:

También puede declarar celdas como propiedad privada para hacerlas accesibles para otra clase.


Las primeras tres respuestas son completamente correctas, solo debes asegurarte de no llamar a la función dequeueReusableCellWithIdentifier en un UITableView . Además de esto, simplemente puede asignar las celdas en el código. Primero necesitará una variable de instancia que almacenará los punteros a sus celdas (asumiré que usa un controlador de vista normal):

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

Entonces puedes crear una instancia perezosa de esta matriz, anulando a 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 métodos adecuados de 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; }

Esto hace que el código sea mucho más limpio y que sea menos propenso a las fugas de memoria (las variables estáticas se desasignan cuando finaliza el programa, ¿por qué mantenemos las celdas de la vista de tabla en la memoria si el controlador de visualización que las muestra ya se fue?

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


Simplemente asigne una nueva celda en lugar de dequeue sin necesidad de hacer nada de lo anterior. Las implicaciones de rendimiento son insignificantes para la pequeña tableView (<100 celdas).

Ejemplo en swift 3

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

Aclamaciones


Simplemente no implemente el método UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SomeID"]; y ninguna de tus células será reutilizada. Cada vez que solicite una celda, cree una nueva y configúrela.


Establecer nil para reutilizar identificador en la línea

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

O simplemente eliminar la línea y añadir,

UITableViewCell *cell = nil;