uitableviewcontroller example iphone cocoa-touch uitableview order

iphone - example - uitableview swift 4 programmatically



Cómo limitar la reordenación de fila UITableView a una sección (7)

Me estaba golpeando la cabeza con esto, y Google no estaba obteniendo nada. Eventualmente lo resolví y pensé que lo escribiría aquí por el bien de la próxima persona.

Usted tiene una UITableView con múltiples secciones. Cada sección es homogénea, pero la tabla en general es heterogénea. Por lo que es posible que desee permitir el reordenamiento de las filas dentro de una sección, pero no a través de las secciones. Tal vez solo quiera que una sección sea obligatoria (ese fue mi caso). Si está buscando, como yo lo estaba, en el UITableViewDataSourceDelegate , no encontrará una notificación para cuando se trata de permitirle mover una fila entre secciones. Obtienes uno cuando comienza a mover una fila (lo cual está bien) y otro cuando ya se movió y tienes la oportunidad de sincronizar con tus cosas internas. No es útil.

Entonces, ¿cómo se puede evitar volver a ordenar entre las secciones?

Publicaré lo que hice como una respuesta separada, dejándola abierta para que otra persona publique una respuesta aún mejor.


Esta implementación evitará reordenar fuera de la sección original como la respuesta de Phil, pero también ajustará el registro a la primera o a la última fila de la sección, dependiendo de dónde fue el arrastre, en lugar de dónde comenzó.

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { if (sourceIndexPath.section != proposedDestinationIndexPath.section) { NSInteger row = 0; if (sourceIndexPath.section < proposedDestinationIndexPath.section) { row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1; } return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section]; } return proposedDestinationIndexPath; }


Lo suficientemente simple, realmente.

UITableViewDelegate tiene el método:

tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:

Esto recibe una llamada mientras el usuario está sobre un punto de caída potencial. Tienes la oportunidad de decir: "¡No, no lo tires allí! Tíralo en su lugar". Puede devolver una ruta de índice diferente a la propuesta.

Todo lo que hice fue verificar si los índices de sección coinciden. Si lo hacen, entonces genial, devuelve el camino propuesto. si no, devuelve la ruta de origen. Esto también evita que las filas de otras secciones se muevan mientras arrastra, y la fila arrastrada volverá a su posición original de tratar de moverla a otra sección.

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { if( sourceIndexPath.section != proposedDestinationIndexPath.section ) { return sourceIndexPath; } else { return proposedDestinationIndexPath; } }


Para no cambiar de posición entre las secciones Swift3

override func collectionView(_ collectionView: UICollectionView, targetIndexPathForMoveFromItemAt originalIndexPath: IndexPath, toProposedIndexPath proposedIndexPath: IndexPath) -> IndexPath { if originalIndexPath.section != proposedIndexPath.section { return originalIndexPath } else { return proposedIndexPath } }


Puede evitar el movimiento de filas entre secciones utilizando el método siguiente. Simplemente no permita ningún movimiento entre secciones. Incluso puedes controlar el movimiento de una fila específica dentro de una sección. por ejemplo, la última fila en una sección.

Aquí está el ejemplo:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { // Do not allow any movement between section if ( sourceIndexPath.section != proposedDestinationIndexPath.section) { return sourceIndexPath; } // You can even control the movement of specific row within a section. e.g last row in a Section // Check if we have selected the last row in section if (sourceIndexPath.row < sourceIndexPath.length) { return proposedDestinationIndexPath; } else { return sourceIndexPath; } }


Swifty versión rápida de la respuesta de Jason para usted, gente perezosa:

override func tableView(tableView: UITableView, targetIndexPathForMoveFromRowAtIndexPath sourceIndexPath: NSIndexPath, toProposedIndexPath proposedDestinationIndexPath: NSIndexPath) -> NSIndexPath { if sourceIndexPath.section != proposedDestinationIndexPath.section { var row = 0 if sourceIndexPath.section < proposedDestinationIndexPath.section { row = self.tableView(tableView, numberOfRowsInSection: sourceIndexPath.section) - 1 } return NSIndexPath(forRow: row, inSection: sourceIndexPath.section) } return proposedDestinationIndexPath }


Than @Jason Harwig, el siguiente código funciona correctamente.

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { if (sourceIndexPath.section != proposedDestinationIndexPath.section) { NSInteger row = 0; if (sourceIndexPath.section < proposedDestinationIndexPath.section) { row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1; } return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section]; } return proposedDestinationIndexPath; }


Swift 3:

override func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath { if sourceIndexPath.section != proposedDestinationIndexPath.section { var row = 0 if sourceIndexPath.section < proposedDestinationIndexPath.section { row = self.tableView(tableView, numberOfRowsInSection: sourceIndexPath.section) - 1 } return IndexPath(row: row, section: sourceIndexPath.section) } return proposedDestinationIndexPath }