uitableviewdatasource uitableviewcontroller uitableviewcell example iphone objective-c cocoa-touch uitableview core-data

iphone - uitableviewcell - uitableviewcontroller swift 4



ReordenaciĆ³n de datos Core UITableView (1)

No estoy seguro de qué parte tiene problemas (según los comentarios) ... pero esta es mi sugerencia. DisplayOrder es simplemente un atributo simple en una clase NSManagedObject. Si puede guardar un objeto administrado, entonces podrá finalizar esta función. Primero tomemos un simple NSManagedObject:

@interface RowObj : NSManagedObject { } @property (nonatomic, retain) NSString *rowDescription; @property (nonatomic, retain) NSNumber *displayOrder;

Luego, necesitamos tener una copia local de los datos que se muestran en la tabla vista. He leído los comentarios que ha hecho y no estoy seguro de si está usando el Controlador de resultados recuperados o no. Mi sugerencia sería comenzar de manera simple y simplemente usar un TableViewcontroller normal donde actualices los datos de la fila cada vez que un usuario cambie el orden de visualización ... luego guarda la orden cuando el usuario termine de editar.

La interfaz para este tableviewcontoller se vería así:

@interface MyTableViewController : UITableViewController { NSMutableArray *myTableViewData; } @property(nonatomic,retain) NSMutableArray *myTableViewData; @end

A continuación, debemos cargar los datos de la vista de tabla en el método viewWillAppear:

- (void)viewWillAppear:(BOOL)animated { myTableViewData = [helper getRowObjects]; // insert method call here to get the data self.navigationItem.leftBarButtonItem = [self editButtonItem]; }

Aquí están sucediendo dos cosas ... (Explicaré el EditButtonItem más adelante), la primera es que necesitamos obtener nuestros datos de CoreData. Cuando tengo que hacer esto, tengo algún tipo de ayuda (llámalo como quieras) el objeto hace el trabajo. Un método de búsqueda típico se vería así:

- (NSMutableArray*) getRowObjects{ NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"RowObj" inManagedObjectContext:[self managedObjectContext]]; [request setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [request setSortDescriptors:sortDescriptors]; [sortDescriptors release]; [sortDescriptor release]; NSError *error; NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; if (mutableFetchResults == nil) { // Handle the error. } [request release]; return mutableFetchResults; }

Ahora que tiene sus datos, ahora puede esperar a que el usuario edite la tabla. Ahí es donde el [self editButtonItem] entra en juego. Esta es una característica incorporada que devuelve un elemento de botón de barra que alterna su título y estado asociado entre Editar y Listo. Cuando el usuario presione ese botón, invocará el método setEditing: animado:

Para actualizar el orden de visualización, debe anular el método setEditing en la clase UITableViewController. Debería verse algo como esto:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; [myTableView setEditing:editing animated:animated]; if(!editing) { int i = 0; for(RowObj *row in myTableViewData) { row.displayOrder = [NSNumber numberWithInt:i++]; } [helper saveManagedObjectContext]; // basically calls [managedObjectContext save:&error]; } }

No tenemos que hacer nada cuando el usuario está en modo de edición ... solo queremos guardar una vez que hayan presionado el botón "Listo". Cuando un usuario arrastra una fila en su tabla, puede actualizar su orden de visualización anulando los métodos canMoveRowAtIndexPath y moveRowAtIndexPath:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { return true; } (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath { RowObj *row = [myTableViewData objectAtIndex:sourceIndexPath.row]; [myTableViewData removeObjectAtIndex:sourceIndexPath.row]; [myTableViewData insertObject:row atIndex:destinationIndexPath.row]; }

De nuevo, la razón por la que no actualizo el valor de displayOrder aquí es porque el usuario todavía está en modo de edición ... no sabemos si el usuario ha terminado de editar E incluso podrían cancelar lo que han hecho al no tocar el Botón "Hecho".

EDITAR

Si desea eliminar una fila, debe anular tableView: commitEditingStyle: forRowAtIndexPath y hacer algo como esto:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the managed object at the given index path. RowObj *row = [myTableViewData objectAtIndex:indexPath.row]; [helper deleteRow:row]; // Update the array and table view. [myTableViewData removeObjectAtIndex:indexPath.row]; [myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; } }

Sé que esta pregunta ya se hizo antes, y eché un vistazo a la respuesta a esta pregunta . Sin embargo, todavía estoy confundido sobre cómo implementar el reordenamiento con una UITableView en un proyecto de Datos centrales. Lo que sé es que necesito tener un atributo "displayOrder" en mi entidad para rastrear el orden de los elementos, y debo enumerar todos los objetos en los resultados obtenidos y establecer su atributo displayOrder.

En el código dado en la pregunta a la que me he vinculado, el método delegado de vista de tabla llama a un método como este [self FF_fetchResults]; , y no se proporciona el código para ese método, por lo que es difícil decir exactamente qué es.

¿Hay algún código de muestra que demuestre esto? Eso sería más simple de ver que compartir grandes cantidades de código.

Gracias