Inicializar un UITableView con filas "insertadas"

Tengo un UITableView en el que quiero insertar y eliminar filas.

Si tengo una matriz de 10 valores y empiezo con la vista de tabla que incluye todas las filas, la tabla se muestra bien. Entonces, si quiero filtrar todo excepto [0, 1, 5]. Luego realizo el proceso de eliminación de filas en las rutas de índice: [2, 3, 4, 6, 7, 8, 9] y el número de filas devuelto es 3. No tengo que cambiar el código de representación de mi celda, muestra filas: [0, 1, 5].

Sin embargo, si después de haber filtrado todo, quiero volver a esta tabla y cargar desde la persistencia la tabla con las filas [0, 1, 5], estoy teniendo problemas. La tabla se carga con el número de filas: 3 y muestra las celdas: [0, 1, 2].

Intenté inicializar la tabla en viewDidLoad con 0 filas y luego en viewDidAppear llamando a insertRows:[0, 1, 5], pero esto genera una excepción:

*** Error de aserción en -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:909

Y he verificado que en viewDidLoad, la cantidad de filas está imprimiendo 0, y justo antes de que se arroje este error, la cantidad de filas impresas es 3.

EDITAR Si en su lugar inserto [0, 1, 2], funciona... pero de nuevo... finalmente necesito que aparezca [0, 1, 5].

 - (vacío) viewDidAppear:(BOOL) animado { [super viewDidAppear:animated]; NSArray *initializing_indeces = @[[NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0], [NSIndexPath indexPathForRow:5 inSection:0]]; [self.userDataTable insertRowsAtIndexPaths:initializing_indeces withRowAnimation:UITableViewRowAnimationAutomatic]; }
- (int) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Usando diferentes booleanos, pero la esencia: if (viewDidLoad) devuelve 0; if (viewDidAppear || filtrado) devuelve 3; si (expandido) devuelve 10; }
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"]; } [cell.textLabel setText:[NSString stringWithFormat:@"%i",indexPath.row]]; celda de retorno; }

preguntado el 12 de febrero de 13 a las 04:02

pon el código relevante aquí :) -

Ok, vea estos enlaces y verifique: stackoverflow.com/questions/6241625/… & también esto stackoverflow.com/questions/10134841/… -

En numberOfRowsInSection, debe dar 10 filas ... Y completar cualquier operación, escriba [tableView reloadData]; -

4 Respuestas

Tengo que hacer un seguimiento del mapeo yo mismo:

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"]; } int fila = indexPath.row; if (filtrado) { // Traducir 0 - 0 // Traducir 1 - 1 // Traducir 2 - 5 } [cell.textLabel setText:[NSString stringWithFormat:@"%i", fila]]; celda de retorno; }

Terminé usando un NSMutableArray que, cuando se filtra, se convierte en [0, 1, 5], por lo que al acceder al índice de ese conjunto, indexPath.row of 2 devuelve 5.

Respondido 12 Feb 13, 05:02

@Fish Stix

[cell.textLabel setText:[NSString stringWithFormat:@"%i",indexPath.row]];

este método en su código establece claramente que el texto será NSString con el valor de indexPath.row. Ahora, cuando elimine sus filas y fuente de datos, desde 10 = [0, 1, 5] + [2, 3, 4, 6, 7, 8, 9] a 3 = [0, 1, 5]. Su fuente de datos se ha reducido a una matriz de conteo 3. Por lo tanto, obtendrá tres filas solo como devueltas por bby numberOfRowsInSection método. Las tres filas tendrán estos indexPath.row's 0, 1, 2. Y por lo tanto estás recibiendo 0,1 ,2 en lugar de 0, 1 ,5.

si imprime el indexPath, en cellForRowAtIndexPath método (después del filtrado) los verá como [0, 0] [0, 1] [0, 2], lo que significa la sección 0 y el número de fila 0, 1, 2 respectivamente. Y por lo tanto su resultado

Como para obtener el resultado deseado. hacer esto. toma una propiedad @property (retain, nonAtomic) NSArray *dataArray;

in verDidLoad: self.dataArray = [NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];

in numeroDeFilasEnLaSeccion volver [recuento de matriz];

y en celdaParaFila [cell.textLabel setText:[self.dataArray objectAtIndex:indexPath.row]];

Ahora solo cambie el origen de datos (me refiero a dataArray) a estado filtrado o expandido) en verAparecerá o donde quieras y recargar los datos de la tabla usando [self.tableView reloadData];

Espero ser claro. Saludos, diviértete.

Respondido el 20 de junio de 20 a las 10:06

Primero en tu caso numberOfRowsInSection retorno NSInteger no int, así que por favor cámbialo

No sé exactamente qué es el resone. Supongo que ese problema debe estar conectado a esta parte en su código,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Por lo general, está cometiendo un error en uno de estos métodos de origen de datos. Puede que sea imposible decir exactamente qué es lo que está mal, pero podría ser algo como: Le está diciendo a la vista de tabla en thenumberOfRowsInSection (en tu caso 10 )y en thecellForRowAtIndexPath entonces solo manejas 10 - 1 filas por ejemplo. Si nos muestra su implementación de su fuente de datos, sería mucho más fácil saber qué está pasando.

Respondido 12 Feb 13, 04:02

Para cada vez que inserte, debe volver a cargar la vista de tabla usando [tableView realodData]

Respondido 12 Feb 13, 05:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.