Pregunta

Para el iPhone, ¿es posible configurar un UITableView de modo que permita la selección múltiple?

He intentado anular -setSelected: animated: para cada UITableViewCell, pero tratar de evadir el comportamiento requerido es complicado, ya que es difícil separar las selecciones reales de aquellas en las que el UITableView cree que ' ¡No he seleccionado debido a la selección de otra celda!

¡Espero que alguien pueda ayudar!

Gracias,

Nick.

¿Fue útil?

Solución

La mejor manera de hacerlo sería mediante una marca de verificación por fila seleccionada.

Puede hacerlo estableciendo el tipo de accesorio en las instancias UITableViewCell seleccionadas en UITableViewCelAccessoryCheckmark.

Para anular la selección de la fila, vuelva a establecerla en 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 similares en su delegado de vista de tabla en el " seleccionó " delegar métodos.

Otros consejos

La siguiente propiedad debería funcionar bien si está desarrollando una aplicación para iOS5.0 +

self.tableView.allowsMultipleSelection = YES;

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

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 he estado en el fondo de mi mente por un tiempo, sabiendo que llegará el día en que lo necesite.

Regresé allowMultipleSelectionDuringEditing y allowMultipleSelection desde iOS5 a iOS más antiguo. Puede bifurcarlo en https://github.com/ud7/UDTableView-allowsMultipleSelection

Se reemplaza rápidamente y lo único que debe hacer es cambiar UITableView a UDTableView (en el generador de código o interfaz)

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, el   la fila que contiene el elemento se resalta brevemente cuando un usuario lo selecciona para mostrar que la selección se ha recibido.   Luego, se produce una acción inmediata: se revela una nueva vista o la fila muestra una marca de verificación para indicar   que el artículo ha sido seleccionado. La fila nunca permanece resaltada, porque las vistas de tabla no muestran   estado seleccionado persistente.

Tendrá que rodar su propio estilo de selección múltiple, ya sea con algo como Correo, o usando el accesorio de marca de verificación en sus celdas.

Chicos para la 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;
}

Si está tratando de hacer algo como la selección múltiple de Correo (para eliminar el correo, por ejemplo), entonces probablemente tendrá que administrar toda la selección usted mismo. La selección de varias filas no es algo estándar en el iPhone. El correo resuelve esto usando marcas de verificación para indicar qué filas se han seleccionado.

la fila resaltada en azul como un indicador de si una fila está seleccionada se desaconseja de acuerdo con HIG página 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 matriz o la forma en que desea almacenar los datos de los cuales fueron seleccionados.

Estaba buscando el mismo problema y la respuesta de Bhavin Chitroda lo resolvió por mí, pero con algo más para mantener la marca de verificación 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 adición:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
    if ( [array indexOfObject:indexPath] == NSNotFound ) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    return cell;

}

Nota: Esto no funciona en iOS 4+. Esta es una constante privada, no documentada. No lo use.

Si no planea enviar su aplicación a la App Store, puede invocar el modo de edición de varias filas implementando el siguiente método en su delegado UITableViewController:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 3; // Undocumented constant
}

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top