tutorials que apple iphone objective-c uitabbarcontroller uitableview storyboard

iphone - apple - que es el storyboard xcode



Segue dispara pero no empuja/UITabBarController/UITableViewController cuando hace clic en la celda (2)

No es necesario performSegue programáticamente. Puede crear una transición desde el primer UITableViewController al segundo en el guión gráfico, mediante el control del arrastre desde UITableViewCell del primer UITableViewController al segundo UITableViewController. Si la transición no se realiza, su razón más probable es que, identificador de celda en el método

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

y en el "Inspector de atributos" no coinciden.

Para pasar datos del primer UITableViewController al segundo, agregue el siguiente método al primero:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"loadMyDetailView"]) { MyDetailViewController *detailVC = [segue destinationViewController]; NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow]; detailVC.dataToPass = [self getDataToPass:selectedRowIndex.row]; } }

Debe haber una solución simple para esto, pero después de 4 horas de navegación en StackExchange, me estoy dando por vencido y tratando de obtener esta respuesta aquí:

Situación: iOS 5, Xcode 4.2.1, usando Storyboards

Preparar:

  • Controlador de navegación raíz = UITabBarController con 5 elementos
  • Cada pestaña se vincula a UITableViewController (mediante segues), que funciona a la perfección, de forma automática
  • Tengo clases para cada controlador de vista y el controlador de navegación (UITabBarController)
  • Hago clic en una pestaña, digo "Programa", y me muestra una lista de elementos (en el UITableViewController vinculado), digamos que uno de estos elementos es "Sesiones"
  • Hago clic en "Sesiones", didSelectRowAtIndexPath se llama muy bien.
  • Quiero realizar un segue ahora (que he conectado desde ese UITableViewController, no la celda, al nuevo UITableViewController y le he dado un identificador.
  • Llamo: [self performSegueWithIdentifier:@"programToSessions" sender:self];

  • Se llama a prepareForSegue, pero nada después. Sin error, sin advertencia. El nuevo UITableViewController no aparece.

  • Nota: SÍ aparece, sin embargo, si cambio el segue a un "modal" - pero descarta / oculta la barra de pestañas original en la parte inferior entonces (no intencionado ...)

Hasta ahora, mi problema parecía tener una solución probable. El controlador de navegación. Pensé que, si configuraba una referencia de controlador de navegación en AppDelegate, la iniciaba / configuraba una vez que el controlador de navegación raíz real estaba cargado (en viewDidLoad), es decir, básicamente utilizaba algo como: app.navController = self.navigationController en viewDidLoad - Esto podría funcionar! ¿Derecha? Entonces, cambié la acción segue a: [app.navController performSegueWithIdentifier:@"programToSessions" sender:self];

Sin embargo, nada cambia, no aparece.

¿Algunas ideas?

Resuelto

Hubo algunos problemas aquí. El problema principal fue el hecho de que me olvidé de poner un "Controlador de navegación" entre UITabBarController y UITableViewController. Esto se puede hacer agregando un nuevo "Controlador de navegación" al guión gráfico, luego arrastre desde UITabBarController (el controlador raíz de visualización) a este nuevo controlador y establezca una RELACIÓN. A continuación, arrastre una RELACIÓN al UITableViewController. Entonces, como se indica en la respuesta correcta, debería verse como: UITabBarController -> (relación) -> UINavigationController -> (relación) -> UITableViewController

Para cargar nuevos UITableViewControllers en la parte superior del último UITableViewController, será suficiente con un simple paso y llamarlo a través del código. El árbol final se verá así:

UITabBarController -> (relación) -> UINavigationController -> (relación) -> UITableViewController -> (segue) -> UITableViewController

Dale a la segue un identificador. En código, usa esto:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"loadMyDetailView" sender:self]; }


Tienes que usar prepareForSegue:sender: para disparar el equivalente de didSelectRowAtIndexPath: (Vaciar el último.) En lugar de presionar el nuevo controlador de vista en la pila de navegación, el segue ya tiene una propiedad destinationViewController que simplemente funcionará automáticamente. Puede modificar esta propiedad si desea personalizar el nuevo controlador de vista. ¡Asegúrese de que segue.identifier sea ​​correcto!

Además, de su pregunta noto cierta confusión sobre los controladores de los controladores de vista. Usted menciona dos de estos: el controlador de la barra de pestañas y un controlador de navegación. En el guión gráfico, la configuración debería ser así:

TabBarController --(relationship)--> NavigationController --(relationship)--> ViewController --(segue)--> next ViewController

Asegúrese de que todo esto sea correcto en el guión gráfico y vea si funciona.