2012-06-06 7 views
6

tengo un problema con mi UITableView dentro PopoverController. Cuando toco la celda, se llama a la función didSelectRowAtIndexPath y se cambia el tipo de accesorio de la celda. Ejemplo simplificado:UITableViewCell con marca de verificación no es visible

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    [self.tableView reloadData]; 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 

Está funcionando, la célula es inspeccionado, pero no es visible en mi tableview: No puedo ver la marca de verificación azul. Sin embargo, en estado táctil en la celda, la marca de verificación es visible en blanco (y el fondo de la celda es gris). Pero no visible en el estado predeterminado.

¿Tiene alguna idea de por qué mi marca de verificación no está visible en el estado predeterminado?

Gracias,

de edición: Añadir captura de pantalla, para una célula con accessoryType = UITableViewCellAccessoryCheckmark

enter image description here

+0

para el estado predeterminado debe poner cell.accessoryType = UITableViewCellAccessoryCheckmark; inside - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) método indexPath. –

+0

Sí, lo puse y está funcionando. Mi problema es en la pantalla ... – alexmngn

+0

Ahora por defecto está trabajando, y en la pantalla lo que falta –

Respuesta

0

vuelve a cargar el UITableView así que en teoría se recrean las células y esta vez sin la marca de verificación. Haga lo siguiente:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 
+0

Pero necesito volver a cargar los datos ... – alexmngn

+0

Lo suficiente, entonces necesita marcar esa celda específica de alguna manera. Entonces, cuando se recarga el 'UITableView', la marca de verificación seguirá allí. Puede mantener una referencia al 'indexPath' y en' cellForRowAtIndex' que se encarga de verificar. – Peres

+0

No es el problema, en mi 'cellForRowAtIndexPath' verifico y añado la marca de verificación si es necesario. Mi problema está en la pantalla, no en la función. – alexmngn

2

que tenía un problema similar donde, después de volver a cargar la fila con una marca de verificación establecer como accesorio, la marca de verificación no sería visible (pero sería visible en blanco cuando se seleccionó la fila) . En las pruebas alrededor del problema, descubrí que la marca de verificación siempre está presente en la celda, es solo blanco sobre blanco.

Mi comprensión del problema es que cuando solicito que se recargue la celda (para que pueda mostrarla con una marca de verificación), la celda existente se coloca en la cola de reutilización, pero en ese momento se encuentra en una estado (porque el usuario acaba de seleccionarlo). Es todavía en un estado seleccionado cuando la célula regresa de la cola de reutilización y se vuelve a configurar en tableView: cellForRowAtIndexPath, y porque está seleccionada, el accesorio se encuentra en blanco en lugar de en un color visible.

Para solucionar esto, agregué una línea en tableView: cellForRowAtIndexPath para forzar que la celda no se seleccionara. El accesorio ahora está siempre visible cuando se muestra la nueva celda.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Get a reusable cell - this only works with Storyboard prototype cells 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 

    // THE MAGIC BIT 
    // Force the cell to not be in a selected state.  
    cell.selected = NO; 
    // END MAGIC BIT 

    if (indexPathIsPathOfSelectedRow) { 
     // This is the selected cell, so show the checkmark accessory. 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     // In case we're reusing a cell that previously showed a checkmark, clear it. 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return cell; 
} 
3

He intentado la respuesta Jacky Boy - no me ayudó. Pero algo había en la anulación de la selección ...

Así que he tratado de anular la selección de la celda de la didSelectRowAtIndexPath: antes de añadir el accesorio marca de verificación:

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UITableViewCell* selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if (row != _selectedRow) { 

     if (selectedCell.accessoryType == UITableViewCellAccessoryNone) { 

      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      _selectedRow = row; 

     } else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) { 

      selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     [tableView reloadData]; 
    } 

}

Y para mí funcionó por fin, ¡la bonita marca oscura ahora es claramente visible en la celda!

Por supuesto que hay una parte en cellForRowAtIndexPath: similar a la descrita en la respuesta de arexx.

0

Corriendo bajo iOS 6.1, el comportamiento que veo es una celda con una marca de verificación blanca sobre un fondo casi blanco. Esto parece estar sucediendo porque el código que dibuja el accesorio de marca de verificación cree que la celda está en un estado resaltado, por lo que en lugar de dibujar la marca de verificación en el color azul normal, se dibuja en blanco.

Ajuste del estado seleccionado de la celda no funcionaba para mí, pero establecer el estado resaltado inmediatamente antes de establecer el tipo de accesorio hizo. Con lo siguiente en su lugar, siempre obtengo una marca de verificación azul oscuro.

cell.highlighted = NO; 
if (checked) 
    self.accessoryType = UITableViewCellAccessoryCheckmark; 
else 
    self.accessoryType = UITableViewCellAccessoryNone; 
+0

'No trabajo''''''''''''' – Gank

0

Si desea volver a cargar los datos a continuación, tiene que guardar seleccionada Id de alguna variable para una sola selección, como rowIndex y luego en

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //check index 
    if (rowIndex==indexPath.row) 
     {cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else{ 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
} 

Gracias.

7

Esto me sucedió cuando cambié el color del tinte global a blanco. Una vez que me di cuenta, entré en UITableView y cambié el color del tinte localmente solo para esta tabla. Fijo.

+0

Esto me ayudó a resolver mi problema. Si alguien más tiene este problema y quiere mantener el conjunto de colores de tinte global, sólo cambia el matiz en viewDidLoad() en su clase TableView: self.view.tintColor = UIColor.blackColor() – Jordan

0
-(UIImageView *)checkmarkImg{ 
    UIImage *image = [[UIImage imageNamed:@"ic_check_black_24dp.png"] changeColor:CLR_BUY]; 
    UIImageView *checkmark = [[UIImageView alloc] initWithImage:image]; 
    return checkmark; 
} 

     cell.accessoryView = [self checkmarkImg]; 
2

La mía era la razón más estúpida. Creé una vista de tabla en el guión gráfico, con un controlador de vista de tamaño 5.5 pulgadas y olvidé aplicar las restricciones de diseño.

Entonces puse en marcha en un teléfono de 4 pulgadas, todo parecía bien, excepto la vista accesorio no era visible debido a la anchura tableviews fue mayor que la de la pantalla del teléfono. Me llevó 3 horas descubrir mi error.

Cuestiones relacionadas