2012-04-21 14 views
8

Estoy tratando de hacer algo muy simple: configure un segue para que cuando haga clic en una celda en una tabla lo lleve a otro controlador de vista. El problema, creo, se origina en el hecho de que el TableView en el que se encuentran estas celdas está incrustado en un ViewController normal (a diferencia de un TableViewController), y es una de las dos subvistas en este ViewController.Segmentos de celdas de vista de tabla no funcionan

Por lo que puedo decir, configuré todo correctamente: incrusté ViewController con las dos subvistas en un controlador de navegación, lo configuré como el origen de datos y lo delegué para el TableView, y creé un intervalo de inserción de una TableViewCell para mi segundo Controlador de Vista en el guión gráfico. Sin embargo, cuando se ejecuta la aplicación y un usuario hace clic en una fila de la tabla, simplemente selecciona la fila y la segue no se dispara (lo he depurado y la función prepareForSegue ni siquiera se está llamando).

¿Hay algo que me falta aquí? ¿O es esto por alguna razón no posible si TableView no es la única vista en su controlador de vista?

+0

¿Ha dado las celdas de la tabla identificadores únicos –

+0

doy la células el identificador "LoadCell" tanto en el guión gráfico (en los atributos de la celda del prototipo) como en la función cellForRowAtIndexPath; ¿Es correcto, o se debe dar a cada celda individual un identificador distinto cuando se crea? – generaltsow

Respuesta

2

Si va a crear la Historieta en Xcode continuación, haga lo siguiente:

  1. Crear una UITableViewController
  2. Añadir un prototipo UITableViewCell
  3. Crear el UIViewController que será su destino segue.
  4. Control-Haga clic en el prototipo UITableViewCell y arrástrelo al segue target.

Eso es todo. Probablemente quiera editar las características de UITableViewCell para que sea, por ejemplo, su subclase de UITableViewCell.

+2

Esto es precisamente lo que he hecho, excepto que en lugar de tener un UITableViewController tengo un UIViewController regular, con una UITableView (así como otra UIView) como subvistas dentro de la vista principal. Todavía no funciona. – generaltsow

+0

En Xcode, ¿el guión gráfico 'push' de tableViewCell está vinculado al controlador que es su objetivo segue? – GoZoner

+0

Sí, por supuesto. – generaltsow

4

Esto puede o no puede ser útil, pero me encontré con este problema porque había definido dos tipos de celda diferentes y había proporcionado la implementación didSelectRowAtIndexPath. Tuve que agregar [self performSegueWithIdentifier:@"Whatever" sender:self] como parte de didSelectRowAtIndexPath y el problema se resolvió.

Si puede detectar al menos selecciones de fila, puede aprovechar este método.

+0

Esto resolvió el problema para mí, pero con el emisor como la celda: 'remitente: [self.tableView cellForRowAtIndexPath: indexPath]' – brasskazoo

4

Si ha personalizado la prestación de células, por ejemplo .:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

luego asegurarse de que está utilizando el mismo identificador de celda como se especifica para la célula prototipo en la historia ste.

Por lo tanto, en este caso, el 'Identificador' de la celda que conectó el segue debería establecerse en 'Celda'.

+0

Pasé las últimas dos horas tratando de resolver esto (solo empecé a jugar con Objective-C esta noche. Muchas gracias, eso me estaba volviendo loco. –

+0

Esta es la respuesta, gracias. –

4

me parece que si tuviera cable recientemente la segue a la vista de accesorios de la célula, y posteriormente eliminar el segue y tratar de conectar un nuevo segue a la célula directamente sí no trabajo (usando Xcode 4.6.2) - - Xcode sigue conectando el segue a la vista de accesorios (incluso si no hay uno)! La forma en que lo arreglé es seleccionando la celda en IB y usando el inspector de conexiones para (1) eliminar el ciclo original de "acción accesoria" y (2) cablear directamente la transición de "selección" arrastrando desde el círculo relleno en la imagen a continuación al controlador de vista de destino apropiado.

enter image description here

+0

tienes razón. esto es lo que sucede. –

+0

sigue siendo relevante para Xcode 8 :) muchas gracias. resolvió mi problema – gutte

-1

tenía el mismo problema.Segue desde una celda de vista de tabla prototipo dentro de un controlador de vista regular haría que la aplicación se bloquee. En caso de que alguien tenga el mismo problema.

Mi solución:

Si está utilizando un segue empuje asegúrese de que el primer controlador de vista con la vista de tabla está incrustado en un regulador de la navegación de otro modo "push da paso" no funcionará. ¡También apunte el segue al controlador de vista de destino, no a su controlador de navegación!

Y como se mencionó anteriormente, asegúrese de que sus "identificadores de segue" sean correctos.

en "didSelectRowAtIndexPath" que llamo "[auto performSegueWithIdentifier: @" Your_destination_View_Controller" remitente: auto];

+0

Agregar performSegueWithIdentifier hace que mi aplicación se cuelgue, lanzando un error de aserción en - [UITableViewCell _setHostsLayoutEngine:]. Al parecer, nadie ha tenido/resuelto este problema antes, ya que no hay respuesta para ello aquí en SO. –

0

tuve el problema similar Fix es 1. Escribir SegueIdentifier para el segue en Storyboard 2.. Añadir la siguiente línea [auto performSegueWithIdentifier: @ remitente "SegueIdentifier": nil];..? en didSelectRowAtIndexPath

espero que esto ayudaría a

+0

funcionó para mí. ¡Gracias! – kalan

+0

Agregar performSegueWithIdentifier hace que mi aplicación se cuelgue, lanzando un error de aserción en - [UITableViewCell _setHostsLayoutEngine:]. Al parecer, nadie ha tenido/resuelto este problema antes, ya que no hay respuesta para ello aquí en SO. –

Cuestiones relacionadas