ios - ultima - ¿Cómo deseleccionar una celda UITableView seleccionada?
qué tecla se debe mantener pulsada para seleccionar un rango de celdas dispersas (22)
¿Puedes probar esto?
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
appDelegte.indexPathDelegate = indexPath;
UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1];
if([prevSelectedCell isSelected]){
[prevSelectedCell setSelected:NO];
}
}
Funcionó para mí
Estoy trabajando en un proyecto en el que tengo que preseleccionar una celda en particular.
Puedo preseleccionar una celda usando -willDisplayCell
, pero no puedo anular la selección cuando el usuario hace clic en otra celda.
- (void)tableView:(UITableView*)tableView
willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
if ([appDelegte.indexPathDelegate row] == [indexPath row])
{
[cell setSelected:YES];
}
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
appDelegte.indexPathDelegate = indexPath;
[materialTable deselectRowAtIndexPath:indexpath1 animated:NO];
}
¿Puede usted ayudar?
Además de configurar la celda como seleccionada, también debe informar al TableView que la celda está seleccionada. Agregue una llamada a -tableView:selectRowAtIndexPath:animated:scrollPosition:
a su método willDisplayCell:
: y podrá anular su selección como normal.
- (void)tableView:(UITableView*)tableView
willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{
AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
if ([appDelegte.indexPathDelegate row] == [indexPath row])
{
// SELECT CELL
[cell setSelected:YES];
// TELL TABLEVIEW THAT ROW IS SELECTED
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
}
Asegúrese de usar UITableViewScrollPositionNone para evitar el comportamiento de desplazamiento extraño.
Basado en la solución de saikirans, escribí esto, lo cual me ayudó. En el archivo .m:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
selectedRowIndex = nil;
}
else { self.selectedRowIndex = [indexPath retain]; }
[tableView beginUpdates];
[tableView endUpdates];
}
Y en el archivo de encabezado:
@property (retain, nonatomic) NSIndexPath* selectedRowIndex;
Tampoco tengo mucha experiencia, así que revise si hay fugas de memoria, etc.
Esto debería funcionar:
[tableView deselectRowAtIndexPath:indexpath1 animated:NO];
Solo asegúrese de que materialTable y tableView apuntan al mismo objeto.
¿Los materiales están conectados a tableView en Interface Builder?
Para que la anulación de la selección (DidDeselectRowAt) se active cuando se hace clic la primera vez debido a datos precargados; necesita informar al TableView que la fila ya está seleccionada para comenzar, de modo que un clic inicial luego deselecciona la fila:
// Swift 3:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView[indexPath.row] == "data value"
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
}
}
Prueba esto:
for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
Puede ser útil hacer una extensión en Swift para esto.
Swift 4:
Extensión Swift (por ejemplo, en un archivo UITableViewExtension.swift):
import UIKit
extension UITableView {
func deselectSelectedRow(animated: Bool)
{
if let indexPathForSelectedRow = self.indexPathForSelectedRow
{
self.deselectRow(at: indexPathForSelectedRow, animated: animated)
}
}
}
Use por ejemplo:
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
self.tableView.deselectSelectedRow(animated: true)
}
Rápido
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// your code
// your code
// and use deselect row to end line of this function
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
Si desea seleccionar cualquier celda de la tabla con el primer clic y anular la selección con la segunda, debe usar este código:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.selectedIndexPath &&
[indexPath compare:self.selectedIndexPath] == NSOrderedSame) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
self.selectedIndexPath = nil;
}
else {
self.selectedIndexPath = indexPath;
}
}
Swift 2.0:
tableView.deselectRowAtIndexPath(indexPath, animated: true)
Swift 3
Me he encontrado con esto también: cuando navegas o vuelves a la vista de tabla, generalmente no anula la selección de la fila seleccionada previamente para ti. Pongo este código en el controlador de vista de tabla y funciona bien:
override func viewDidAppear(_ animated: Bool) {
if let lastSelectedRow = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: lastSelectedRow, animated: true)
}
}
Swift 4:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
let cell = tableView.cellForRow(at: indexPath)
if cell?.isSelected == true { // check if cell has been previously selected
tableView.deselectRow(at: indexPath, animated: true)
return nil
} else {
return indexPath
}
}
Swift 4:
tableView.deselectRow(at: indexPath, animated: true)
Utilice el siguiente método en la vista de mesa delegado''sSelectRowAtIndexpath (O desde cualquier lugar)
[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];
Verifique con el método delegado si es correcto o no. Por ejemplo;
-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
para
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
prueba esto
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
usa este código
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Change the selected background view of the cell.
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Swift 3.0:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Change the selected background view of the cell.
tableView.deselectRow(at: indexPath, animated: true)
}
Swift 3.0:
Siguiendo la sección de conformidad del protocolo de la guía de estilo veloz de Ray Wenderlich , para mantener los métodos relacionados agrupados, coloque esta extensión debajo de su clase de controlador de vista así:
// your view controller
class MyViewcontroller: UIViewController {
// class stuff here
}
// MARK: - UITableViewDelegate
extension MyViewcontroller: UITableViewDelegate {
// use the UITableViewDelegate method tableView(_:didSelectRowAt:)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// your code when user select row at indexPath
// at the end use deselectRow
tableView.deselectRow(at: indexPath, animated: true)
}
}
Swift 3/4
En ViewController:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
En la celda personalizada:
override func awakeFromNib() {
super.awakeFromNib()
selectionStyle = .none
}
rápido 3.0
tableView.deselectRow(at: indexPath, animated: true)
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];
coloque este código de acuerdo con su código y obtendrá su celda deseleccionada.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}