Seleccionar fila de vista de tabla mediante programación

Respuestas:

109

De la documentación de referencia:

Llamar a este método no hace que el delegado reciba un mensaje tableView:willSelectRowAtIndexPath:o tableView:didSelectRowAtIndexPath:mensaje, ni envía UITableViewSelectionDidChangeNotificationnotificaciones a los observadores.

Lo que haría es:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

Y luego, desde donde quería llamar a selectRowAtIndexPath, en su lugar llama a doSomethingWithRowAtIndexPath. Además de eso, también puede llamar a selectRowAtIndexPath si desea que se realicen los comentarios de la interfaz de usuario.

Jaanus
fuente
44
O cuando selecciona la fila mediante programación, puede llamar a tableView: didSelectRowAtIndexPath: usted mismo (en la clase que ha conectado como delegado).
Kendall Helmstetter Gelner
3
Este método me parece un truco, hizo el trabajo pero creo que debería haber una mejor manera de hacerlo.
Tapan Thaker
1
Realmente no creo que necesite crear una llamada "doSomethingWithRowAtIndexPath" ¿no puede simplemente llamar al método delegado y pasar los argumentos que necesita para ejecutar la lógica didSelect desde el lugar donde implementó el método delegado?
ImpactZero
111

Como Jaanus dijo:

Llamar a este método (-selectRowAtIndexPath: animated: scrollPosition :) no hace que el delegado reciba una tableView: willSelectRowAtIndexPath: o tableView: didSelectRowAtIndexPath: mensaje, ni enviará notificaciones UITableViewSelectionDidChangeNotification a los observadores.

Entonces solo tienes que llamar al delegatemétodo tú mismo.

Por ejemplo:

Versión Swift 3:

let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

Versión ObjectiveC:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath 
                            animated:YES 
                      scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

Versión Swift 2.3:

 let indexPath = NSIndexPath(forRow: 0, inSection: 0);
 self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
 self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)
dulgan
fuente
63

SeleccionarRowAtIndexPath de UITableView : animated: scrollPosition: debería hacer el truco.

Simplemente pase UITableViewScrollPositionNonepor scrollPosition y el usuario no verá ningún movimiento.


También deberías poder ejecutar la acción manualmente:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

después de ti, selectRowAtIndexPath:animated:scrollPosition:así ocurre el resaltado, así como cualquier lógica asociada.

anq
fuente
Lo siento, eso es lo que estoy usando. Accidentalmente puse scrollToRowAtIndexPath. He actualizado la pregunta. scrollToRowAtIndexPath solo resalta la celda.
4thSpace
2
Si, lo siento Dice que no se disparará didSelectRowAtIndexPath allí mismo, en el enlace de documentación que publiqué. Necesito aprender a leer.
anq
@anq: ¡Muchas gracias! Me ayuda cuando llamo a didSelectRowAtIndexPath: indexPath en la celda personalizada.
Bentley
21

si quieres seleccionar alguna fila esto te ayudará

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

Esto también resaltará la fila. Luego delegue

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];
Nazir
fuente
18

Solución Swift 3/4/5

Seleccionar fila

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

DeSelect Row

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)
Sourabh Sharma
fuente
Para mí, agregar '.delegate?' Fue la clave. (Swift 4.5)
KoreanXcodeWorker
4

Existen dos métodos diferentes para las plataformas iPad y iPhone, por lo que debe implementar ambos:

  • controlador de selección y
  • segue.

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    
    // Selection handler (for horizontal iPad)
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    
    // Segue (for iPhone and vertical iPad)
    [self performSegueWithIdentifier:"showDetail" sender:self];
Alexander Volkov
fuente
3

Use esta categoría para seleccionar una fila de la tabla y ejecutar un segmento dado después de un retraso.
Llame a esto dentro de su viewDidAppearmétodo:

[tableViewController delayedSelection:withSegueIdentifier:]


@implementation UITableViewController (TLUtils)

-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                                                                                                                                                 
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                                                                                               
}

-(void)selectIndexPath:(NSDictionary *)args {
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                                                                                                                                                                         
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                                                                                                            

    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                                                                                                                              

    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                                                                                                                                            
}

@end
Jonathan Kolyer
fuente
2
La pregunta no tenía nada que ver con segues.
deleted_user
Sí, casi nada en su respuesta está relacionado con la pregunta
dulgan
2
Agradezco esta respuesta. Esto funciona perfectamente si el usuario quiere lograr el mismo comportamiento pero está usando guiones gráficos.
Bijoy Thangaraj