Vista de tabla: ¿deshabilitar una fila o crear una alerta que detenga un segue?

Tengo dos vistas de tabla llenas en su viewDidLoad con datos provenientes de un sqllite db que contiene nombres de tiendas. En la primera vista elijo un elemento (es decir, una tienda), luego en la segunda tengo que elegir otra tienda una experiencia diferente desde el principio.

¿Puedo deshabilitar una de las filas de la segunda vista de tabla después de que se haya llenado?

Intenté no cargar el nombre (de la primera tienda elegida) en la segunda vista, pero completé la vista de tabla en su viewDidLoad y, lamentablemente, los datos sobre el nombre de la primera tienda elegida no parecen estar disponibles hasta que viewDidAppear y ese momento es demasiado tarde para llenar la vista de tabla.

Intenté, también, agregar una alerta al evento de elegir una fila en la segunda vista de esta manera

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSString *choosenSecondShop= [secondShop objectAtIndex:indexPath.row];
   NSString* nameFirstShop = [function loadFirstShopChoosen]; 

   if ([choosenSecondShop isEqualToString:nameFirstShop]) {
       NSString *message=@"Second shop cannot match the first";
       alert = [[UIAlertView alloc] initWithTitle:@"Errore"
            message: message
            delegate: self cancelButtonTitle: @"Ok" 
            otherButtonTitles:nil, 
            nil];
       [alert show];
    }else {
        // go on with the app's stuff!
    }
}

pero en este caso se muestra la alerta pero también se sigue el segue. ¿Puedo evitar que el segue continúe?

preguntado el 22 de mayo de 12 a las 14:05

1 Respuestas

Hay algunas formas diferentes de atacar este problema:

1. Segue condicional

Esto debería funcionar, aunque no estoy seguro de que sea una gran idea desde la perspectiva de la experiencia del usuario.

¿Presumiblemente hizo una transición en IB a partir de la celda de la tabla? Cuando hace eso, obtiene la comodidad de no necesitar ningún código para realizar el segue (se hace automáticamente cuando toca la celda de la tabla), pero tampoco tiene ningún control de tiempo de ejecución sobre él.

Si necesita control programático sobre si/cuándo/qué segue realizar, debe crear un segue comenzando desde el controlador de vista (no desde un control dentro de él) y darle al segue un identificador único en IB. Entonces, en tu tableView:didSelectRowAtIndexPath: implementación, puede llamar [self performSegueWithIdentifier:@"myIdentifier"] una vez que sepa que desea realizar el segue.

2. Deshabilitar la selección de celdas

Para evitar que se seleccione una celda específica, su controlador de vista de tabla puede implementar tableView:willSelectRowAtIndexPath: regresar nil para cualquier ruta de índice que no desee que el usuario seleccione.

Si lo hace, es posible que desee aclararle al usuario qué filas se pueden seleccionar; puede modificar la apariencia de la celda en tableView:cellForRowAtIndexPath:.

3. No mostrar la celda

Dices que estás llenando la vista de tabla en viewDidLoad, pero en realidad no funciona de esa manera: las vistas de tabla se completan llamando a su fuente de datos y métodos delegados cuando sea necesario. Si desea evitar que un elemento de su conjunto de datos se muestre como una celda en la tabla, solo necesita modificar el comportamiento de su fuente de datos y delegar métodos:

  • tableView:numberOfRowsInSection: debería devolver un número uno menos de lo que sería de otra manera
  • tableView:cellForRowAtIndexPath: debe reflejar la eliminación del artículo; algo como:

    MyShop *shop;
    if (indexPath.row < indexOfFirstShop)
        shop = [shops objectAtIndex:indexPath.row];
    else
        shop = [shops objectAtIndex:(indexPath.row + 1)];
    // then configure cell for the chosen shop
    

Ahora, si no sabe qué fila desea ocultar la primera vez que se llama a estos métodos, todo lo que necesita hacer una vez que obtenga esa información es decirle a la vista de tabla que debe llamarlos nuevamente: [self.tableView reloadData] debería hacer el truco.

contestado el 22 de mayo de 12 a las 18:05

¡Perfecto! Resolví el problema usando la solución 3, haciendo cambios en la matriz que representa mi fuente de datos en viewDidAppear y usando los datos disponibles de la primera tienda elegida como término discriminante para construir la matriz y luego llamando a recargar. Todavía soy novato en ObjectiveC, por lo que no entendí completamente el proceso que involucra la fuente de datos y el delegado. Especialmente el último. ¡Este patrón es mi peor pesadilla! ^^ Muchas gracias, este será el comienzo de un mejor examen detallado .Encontré muy interesantes las tres soluciones e intentaré usar las otras 2 para aprender algo. - Sasha Grievus

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.