2010-10-20 8 views
32

Seguí la sugerencia de Luke Redpath aquí - Selected UItableViewCell staying blue when selected - para anular la selección de la fila al volver a la vista de tabla original, pero no puedo hacer que funcione. De hecho, el método no se activa.Anulando la selección de la fila de la vista de tabla al devolver

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

Sospecho que esto se debe a que la clase no es un UITableViewController, sino una UIViewController con el tableView como una propiedad conectada a la SEMILLA.

¿Cómo obtendría el mismo comportamiento, es decir, anular la selección al regresar?

+0

No debería importar mientras TableView esté conectado correctamente. Debería poder ponerlo en 'didSelectRowAtIndexPath:' y hacer que funcione. También es posible que desee hacer una comprobación rápida de NSLog de lo que '[self.tableView indexPathForSelectedRow]' devuelve, ya que en realidad podría estar devolviendo nada. – iwasrobbed

+0

Lo usé pero tuve un problema donde el cambio de elementos en la celda (fondo, etc.) no se reflejó inmediatamente. Agregando reloadRowsAtIndexPaths: en didDeselectRowAtIndexPath: hizo el truco – nh32rg

Respuesta

15

Si está utilizando un NavigationController, puede hacerlo con su delegado:

- (void)navigationController: (UINavigationController *)navigationController 
     didShowViewController: (UIViewController *)viewController 
        animated: (BOOL)animated 
{ 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

Pero hay que comprobar si el controlador de espectáculo es el que desea =/

[EDIT] Crear la salida y vincularla en IB al NavigationController

@interface MyInt <UINavigationControllerDelegate> 
{ 
    IBOutlet UINavigationController *navigation; 
    ... 
} 
@property (nonatomic, retain) UINavigationController *navigation; 
... 
@end 

@implementation MyInt 
@syntesize navigation; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.navigation setDelegate: self]; 
} 
... 

@end 
+0

Mi controlador de navegación se crea en mi plumín, por lo que no tiene clase correspondiente.¿Hay forma de evitar esto? – cannyboy

+0

Puede asignarlo a un IBOutlet ivar. –

+0

Mi configuración es que tengo una clase MainViewController con un NIB correspondiente. Ese plumín tiene UITabBarController (también propiedad de IBOutlet 'tabBarController' en MainViewController). Dentro de esa barra de pestañas hay varios controladores UINavigation. Estos no están referenciados en el código. Así que no estoy seguro de cómo acceder a ninguno de estos controladores de navegación – cannyboy

8

¿Está seleccionando la fila programáticamente? Si es así, tuve el mismo problema al seleccionar una fila usando [cellToBeSelected setSelected:YES];.

Al utilizar el método UITableViewControllerselectRowAtIndexPath:animated:scrollPosition:, se realiza un seguimiento del actual indexPath seleccionado.

De hecho, si clearsSelectionOnViewWillAppear se establece en verdadero, no se anula la selección manual de filas.

21

por qué simplemente no la desactiva en el método delegado

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 

} 
+2

No tiene que hacer '[self.tableView indexPathForSelectedRow]', indexPath ya es un parámetro, y puede simplemente insertarlo allí. –

+0

Además, si está utilizando el método de delegado, debe usar el parámetro 'tableView' en lugar de' self.tableView', ya que podrían ser diferentes si tiene varias tablas. –

8

que hade el mismo problema, pero después de la depuración que se enteraron del recuento indexPathForSelectedRow era 0 por lo que verificó dos veces mi código y notamos que estaba llamando al

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // some code... 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Después de eliminar esta línea, funcionó como se esperaba.

+0

Esto fue un error completamente obvio que me atrapó. Creo que mucha gente, incluyéndome a mí, canceló el deseleccionamiento en el delegado. – micnguyen

4

Muy simple: Pruebe esta línea.

Añadir deselectRowAtIndexPath en su didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 
0
-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor grayColor]]; 
} 

-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor clearColor]]; 
} 
+0

Por favor, describa por qué esta es la solución. ¿Cuál es el cambio/truco? –

1

Swift 3,0

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
      tableView.deselectRow(at: indexPath, animated: true) 
    //Write Your Other code Here. 
      } 

It Will anular la selección de la fila después de hacer clic en él.

Cuestiones relacionadas