iphone - tutorial - ¿Es posible configurar una UITableView para permitir la selección múltiple?
uitableview tutorial (12)
Para el iPhone, ¿es posible configurar una UITableView que permita la selección múltiple?
He intentado reemplazar -setSelected:animated:
para cada UITableViewCell, pero tratar de eludir el comportamiento requerido es complicado, ya que es difícil separar las deselecciones reales de las que el UITableView piensa que no he seleccionado debido a la selección de otra celda.
¡Espero que alguien pueda ayudar!
Gracias,
Mella.
Chicos para selección múltiple que solo necesitas
self.tableView.allowsMultipleSelection = YES;
en viewDidLoad y
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
tableViewCell.accessoryView.hidden = NO;
// if you don''t use custom image tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
tableViewCell.accessoryView.hidden = YES;
// if you don''t use custom image tableViewCell.accessoryType = UITableViewCellAccessoryNone;
}
Desde el HIG:
Las vistas de tabla proporcionan comentarios cuando los usuarios seleccionan elementos de la lista. Específicamente, cuando se puede seleccionar un elemento, la fila que contiene el elemento se resalta brevemente cuando un usuario lo selecciona para mostrar que se ha recibido la selección. Luego, se produce una acción inmediata: o se revela una nueva vista o la fila muestra una marca de verificación para indicar que el elemento ha sido seleccionado. La fila nunca permanece resaltada, porque las vistas de tabla no muestran un estado persistente seleccionado.
Tendrá que hacer rodar su propio estilo de selección múltiple, ya sea con algo como Correo o utilizando el accesorio de marca de verificación en sus celdas.
Estaba buscando el mismo problema y la respuesta de Bhavin Chitroda me sopló, pero con alguna adición para mantener la marca de verificación tal como estaba mientras se desplazaba.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if ( [array indexOfObject:indexPath] == NSNotFound ) {
[array addObject:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
[array removeObject:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
La adicion:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
if ( [array indexOfObject:indexPath] == NSNotFound ) {
cell.accessoryType = UITableViewCellAccessoryNone;
} else {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
return cell;
}
Jeff Lamarche tiene un tutorial sobre cómo hacer esto aquí:
http://iphonedevelopment.blogspot.com/2008/10/table-view-multi-row-edit-mode.html
No he probado el código, pero ha estado en mi mente por un tiempo, sabiendo que llegará el día en que lo necesite.
La mejor manera de hacerlo sería con una marca de verificación por cada fila seleccionada.
Puede hacerlo estableciendo accessoryType en las instancias de UITableViewCell seleccionadas en UITableViewCelAccessoryCheckmark.
Para anular la selección de la fila, configúrela de nuevo a UITableViewCellAccessoryNone.
Para enumerar qué celdas / filas se seleccionaron (por ejemplo, al hacer clic en un botón), simplemente itere sobre las celdas de la tabla buscando UITableViewCellAccessoryCheckmark. O bien, administre algunos NSSet o elementos similares en su delegado de vista de tabla en los métodos de delegado "did select".
La siguiente propiedad debería funcionar bien si está desarrollando una aplicación para iOS5.0 +
self.tableView.allowsMultipleSelection = YES;
Probado con iOS4.3 - 6.0
-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
if ([controller.searchResultsTableView respondsToSelector:@selector(allowsMultipleSelectionDuringEditing)]) {
controller.searchResultsTableView.allowsMultipleSelectionDuringEditing = YES;
}
else {
controller.searchResultsTableView.allowsSelectionDuringEditing = YES;
}
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellAccessoryCheckmark;
}
Si intentas hacer algo como la selección múltiple de Mail (por ejemplo, eliminar un correo), entonces probablemente tendrás que administrar toda la selección tú mismo. La selección de múltiples filas no es algo estándar en el iPhone. Mail resuelve esto mediante el uso de marcas de verificación para indicar qué filas se han seleccionado.
Use el siguiente código para configurar los tipos de accesorios de la celda:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
}else{
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
}
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {
//add your own code to set the cell accesory type.
return UITableViewCellAccessoryNone;
}
la fila resaltada en azul como un indicador de si se selecciona una fila realmente no se recomienda de acuerdo con la página HIG 121. Las marcas de verificación harán el truco.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
int selectedRow = indexPath.row;
cout << "selected Row: " << selectedRow << endl;
UITableViewCell *indexPathForCell = [tableView cellForRowAtIndexPath:indexPath];
if (indexPathForCell.accessoryType == UITableViewCellAccessoryNone) {
indexPathForCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
indexPathForCell.accessoryType = UITableViewCellAccessoryNone;
}
}
luego agregue su arrays o como quiera almacenar los datos que fueron seleccionados.
allowsMultipleSelectionDuringEditing
y allowsMultipleSelection
de iOS5 a iOS anterior. Puede bifurcarlo en https://github.com/ud7/UDTableView-allowsMultipleSelection
Se trata de un reemplazo y lo único que debe hacer es cambiar UITableView a UDTableView (en código o constructor de interfaz)
Nota: Esto no funciona en iOS 4+. Esta es una constante privada e indocumentada. No lo uses.
Si no planea enviar su aplicación a App Store, puede invocar el modo de edición de múltiples filas implementando el siguiente método en su delegado UITableViewController:
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return 3; // Undocumented constant
}