ios uitableview storyboard xcode4.2

ios - Secuencia condicional realizada al tocar en UITableViewCell



storyboard xcode4.2 (4)

Estoy trabajando en algún proyecto para iOS 5 usando Xcode 4.2. Tengo un UITableViewController y quiero realizar una transición cuando el usuario toca la celda de la tabla, pero el controlador de vista de destino depende de la acción realizada en esa celda. Por ejemplo, cuando el usuario toca la celda Me gustaría cargar SomeViewController, pero cuando el usuario toca la misma celda en el modo de edición, me gustaría cargar AnotherViewController. Desafortunadamente, no hay forma de configurar múltiples segues en la misma celda en el generador de guiones gráficos de Xcode 4.2, o simplemente no lo entiendo. Tal vez haya una forma de crear segue a mano, en el editor de código. En general, lo que quiero lograr es proporcionar al usuario una forma de "ingresar" el elemento representado por la celda utilizando un controlador de vista y "editar" el elemento representado por la misma celda utilizando otro controlador de vista. Cambiar al segundo controlador de vista (editor) cuando en el modo de edición de tabla solo fue el primero, pero tal vez haya una mejor manera. Cualquier ayuda será apreciada.


Esta es una pregunta antigua y algunas excelentes respuestas correctas pero publicaré información adicional. Me sentí útil cuando me encontré con esto:

  1. Si crea un segue en el guión gráfico mediante ctl + arrastre de SomeVC a AnotherVC, elimínelo.

  2. En el navegador de objetos, ctl + arrastre en el nivel ViewController (generalmente el primero en la jerarquía bajo el nombre del VC) de SomeVC a AnotherVC. Dé a segue un identificador único.

  3. Implementar tableView: didSelectRowAtIndexPath: como se describió anteriormente.

  4. Me pareció útil utilizar una instrucción switch en tableView: didSelectRowAtIndexPath:

    switch (indexPath.row) { case 0: [self performSegueWithIdentifier:@"yourIDHere" sender:self]; break; case 1: // enter conditional code here... break; case 2: // enter conditional code here... break; // ... for however many cells you require default: break;

    }

Gracias por las excelentes respuestas a todos.


Estoy agregando una respuesta adicional solo porque después de leer la seleccionada arriba en muchos lugares distintos a este - y es la respuesta correcta - me encontré preguntándome cómo detectar el toque que normalmente desencadenaría el cambio. Verá, si crea su transición del modo habitual arrastrando ctrl desde la celda de la vista de tabla al siguiente controlador, se le realizarán dos cosas automáticamente.

  1. el toque en la celda es detectado
  2. la segue se realiza

pero por supuesto, no puedes bloquear la transición.

Ahora bien, si desea realizar una segmentación condicional , entonces (como se menciona en las otras respuestas), elimine ese segue y cree uno nuevo del UITableViewController (arrástrelo desde el navegador de objetos en lugar del guión gráfico) al siguiente controlador, y dele una nombre.

Entonces, y esta es la parte que me faltaba, implemente tableView:didSelectRowAtIndexPath en su controlador de vista de tabla para realizar el cambio programáticamente y condicionalmente, como se muestra a continuación.

Tenga en cuenta que también necesita identificar su celda de alguna manera para saber si la que le interesa ha sido seleccionada. Podrías hacerlo conociendo la ruta del índice en una tabla estática, pero prefiero configurar el identificador único de mi celda en IB (aunque no lo necesito para quitar el código porque es una tabla estática) y verificarlo. De esa manera, si muevo mi celda hacia arriba o hacia abajo en la tabla estática, no necesitaré cambiar este código.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Find the selected cell in the usual way UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; // Check if this is the cell I want to segue from by using the reuseIdenifier // which I set in the "Identifier" field in Interface Builder if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) { // Do my conditional logic - this was the whole point of changing the segue if (myConditionForSegueIsSatisfied) { // Perform the segue using the identifier I was careful to give it in IB // Note I''m sending the cell as the sender because that''s what the normal // segue does and I already had code counting on that [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell]; } }

Fíjese cómo envío la celda con la segue - la transición normal desde la celda hace eso, y originalmente había pasado de cero, y mi código que dependía de él dejó de funcionar.


Mientras mira el Guión gráfico, mantenga presionada la tecla de control desde su controlador de vista de origen hasta su controlador de vista de Destino. Esto creará un intervalo que puede desencadenar mediante programación directamente desde el controlador de vista de origen. Asegúrese de darle un nombre a Segue. Este nombre es lo que pasará al método performSegue: withIdentifier: del controlador de vista de origen.


Puede controlar fácilmente la apertura de cualquier transición en su UIViewController personalizado implementando:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }