Pasar datos entre controlleres de vista DidSelectRowsAtIndexPath Storyboards

En una aplicación de testing simple, he intentado pasar un object de array denominado "thisArray" desde MasterViewController a una cadena llamada "passedData" en DetailViewController . Estoy usando Storyboards y el UIViewController está embedded dentro del controller de navigation. Utilizando el método prepareForSegue , pasé satisfactoriamente los datos entre el UIViewController :

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"pushData"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; DetailViewController *destViewController = segue.destinationViewController; destViewController.passedData = [thisArray objectAtIndex:indexPath.row]; } } 

Ahora, por algunas razones, quiero usar didSelectRowsAtIndexPath lugar de prepareForSegue . He usado esto:

 - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { NSMutableString *object = thisArray[indexPath.row]; detailViewController.passedData = object; } 

Pero no funcionó. He usado lo siguiente:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; NSMutableString *object = thisArray[indexPath.row]; detailViewController.passedData = object; [self.navigationController pushViewController:detailViewController animated:YES]; } 

Pero tampoco funcionó.

PREGUNTA :

1) ¿Cómo escribir correctamente didSelectRowsAtIndexPath para replace prepareForSegue ?

2) Si utilizo didSelectRowsAtIndexPath , ¿ didSelectRowsAtIndexPath que eliminar la connection segue entre el UIViewController en el Storyboard?

3) ¿Qué pasa si realmente no hay una connection segue entre los controlleres de vista, cómo puedo todavía pasar los datos entre ellos usando didSelectRowAtIndexPath ?

¡Gracias!

ACTUALIZACIÓN: según la respuesta y los comentarios que recibí, he escrito lo siguiente:

Primero he eliminado la connection segue entre los controlleres, establezco el DetailViewController de StoryBoard id, el nombre de la class también es DetailViewController .

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIStoryboard* sb = [UIStoryboard storyboardWithName:@"DetailViewController" bundle:nil]; UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"]; NSMutableString *object = thisArray[indexPath.row]; detailViewController.passedData = object; [self.navigationController pushViewController:detailViewController animated:YES]; } 

pero se está estrellando con el siguiente error:

*** Finalización de la aplicación debido a una exception no NSInvalidArgumentException , razón: 'No se pudo encontrar un storyboard denominado DetailViewController en package

Tu segundo bash es casi correcto. Lo único que no está del todo correcto es la forma en que crea una instancia de un controller de vista desde un storyboard: usa initWithNibNamed: que es lo que usa con las NIB, pero no con los storyboards. Para storyboards, necesita esto:

 UIStoryboard* sb = [UIStoryboard storyboardWithName:@"theStoryboardId" bundle:nil]; // If this code is inside a method called by a controller that is itself instantiated // from a storyboard, you can replace the above line with this.storyboard UIViewController* detailViewController = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"]; 

Vea esta pregunta para más detalles.

Una vez que realice el reemploop, su código debería funcionar como se esperaba.

EDIT:: así es como se vería su método:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIViewController* detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; NSMutableString *object = thisArray[indexPath.row]; detailViewController.passedData = object; [self.navigationController pushViewController:detailViewController animated:YES]; }