Estoy creando mi Nav y TabBar en el código en el lanzamiento a través de:
EN : myAppDelegate.m

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
//set up a local nav controller which we will reuse for each view controller
UINavigationController *localNavigationController;
//create tab bar controller and array to hold the view controllers
tabBarController = [[UITabBarController alloc] init];
NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:4];
//setup the first view controller (Root view controller)
RootViewController *myViewController;
myViewController = [[RootViewController alloc] initWithTabBar];
//create the nav controller and add the root view controller as its first view
localNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
//add the new nav controller (with the root view controller inside it)
//to the array of controllers
[localControllersArray addObject:localNavigationController];
//release since we are done with this for now
[localNavigationController release];
[myViewController release];
//setup the first view controller just like the first 
ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = @"Category1";
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"];
resortsListViewController.navigationItem.title[email protected]"Category1";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
//setup the second view controller just like the first 
ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = @"Category2";
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image2.png"];
resortsListViewController.navigationItem.title[email protected]"Category2";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
//setup the third view controller just like the first 
ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = @"Category3";
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image3.png"];
resortsListViewController.navigationItem.title[email protected]"Category3";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
[resortsListViewController release];
//load up our tab bar controller with the view controllers
tabBarController.viewControllers = localControllersArray;
//release the array because the tab bar controller now has it
[localControllersArray release];
//add the tabBarController as a subview in the window
[window addSubview:tabBarController.view];
//need this last line to display the window (and tab bar controller)
[window makeKeyAndVisible];
}

Como se puede ver, estoy re-uso de ResortsListViewController para diferentes categoría de muestra (balnearios con Playas, balnearios con Piscinas, balnearios con espresso bares) … ahora, sin acosarme (grin) acerca de la estupidez de mi categorías (cos esta es una aplicación de prueba) tengo necesidad de hacer varias cosas:

  1. Tengo que ser capaz de saber qué haga clic en la ficha causado la ResortsListViewController para mostrarse. Tenía la esperanza de utilizar la ETIQUETA pero «initWithRootViewController» no tiene la «etiqueta» de control. Así que, si yo uso un imagefilename que es el nombre de la categoría, puede utilizar ese nombre de archivo para distinguir categorías…o incluso navigationItem nombre. Necesito saber si hay una manera de ResortsListViewController saber que tabbar elemento, haga clic en la causó la pantalla. Pensé en buscar una «acción» que yo pudiera asignar a la tabbar elemento, pero esa no es la manera tabbarcontroller obras.
  2. Al hacer clic en una pestaña a otra, la vista, efectivamente, el cambio, el título de ResortsListViewController cambios, etc…pero el formato tableview tiene no claro y mostrar datos nuevos. Buscando en la web he encontrado una posible solución:

http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0

básicamente diciendo:

Con el fin de UINavigationControllers
para enviar
«viewWill/Did/Aparecer/Desaparecer»
los mensajes, se necesita haber recibido
«viewWill/Did/Aparecer/Desaparecer» de
su contenedor.

Lo que es el contenedor de mi UINavigationControllers en esta situación? myAppDelegate se define en el .h archivo como:

NSObject <UIApplicationDelegate, CLLocationManagerDelegate>

y no tiene un:

- (void)viewWillAppear:(BOOL)animated {
}

sección. Cuando agrego uno que dice «NSObject no puede responder a viewWillAppear» en el depurador.

Cualquier ayuda por ahí?

OriginalEl autor Jann | 2010-02-07

3 Comentarios

  1. 2

    1) de Esto es bastante simple. Usted necesita para establecer el delegado de la propiedad para la UITabBarController. Puede configurar este para el controlador de objeto que es dueño de su tabbarcontroller (o delegado de la aplicación si que es su configuración). Cualquier objeto que se establece como el delegado a continuación, recibir:

    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

    Y

    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

    a la ficha administrar selecciones. Colocar uno de estos métodos en la aplicación de cualquier objeto que se establezca como delegado (que debería ser el objeto que posee todos los controladores).

    2) Si usted tiene un UIViewController que aparece como una ficha de selección (como ResortsListViewController) entonces usted necesita para poner el viewWillAppear método en el controlador de la aplicación a sí mismo:

    @implementation ResortsListViewController
    - (id)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle {
    ...
    }
    ... etc. ....
    - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [table reloadData];
    }
    ...
    @end

    Hágamelo saber si he entendido la segunda parte de su pregunta.

    Voy a probar esto. Te permitirá conocer en la mañana (del domingo). La segunda parte es un poco confuso cos puedo agregar viewWillAppear XCode no te auto-completar este y se advierte que «myAppDelegate» no puede responder a viewWillAppear. Entender?
    Su appDelegate no debe responder a viewWillAppear si es un NSObject (como lo es en cualquier otro estándar de Xcode plantilla). Usted ha mencionado: ResortsListViewController *resortsListViewController. El archivo donde esto se lleva a cabo es donde usted quiere poner su viewWillAppear método.

    OriginalEl autor Matthew McGoogan

  2. 1

    Bueno, aquí va: Este es la respuesta correcta a la pregunta, sin embargo, no terminan siendo tan difícil. Todo lo que tenía que hacer era la siguiente:

    Crear una propiedad en ResortViewController de tipo int con el nombre de la variable whichChoice (por ejemplo). A continuación, la dirección en la configuración de la TabBarController a la:

    //setup the first view controller just like the first 
    ResortsListViewController *resortsListViewController;
    resortsListViewController = [[ResortsListViewController alloc]     initWithNibName:@"ResortsListView" bundle:nil];
    // START HERE IS THE CHANGE
    resortsListViewController.whichChoice = 1;
    // END HERE IS THE CHANGE
    resortsListViewController.title = @"Category1";
    resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"];
    resortsListViewController.navigationItem.title[email protected]"Category1";
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release];

    Para encontrar la ficha que se hizo cuando mi resortsListViewController, yo simplemente consulta la variable de clase: whichChoice para obtener la respuesta.

    Cosas como esta son tan simples que pasa por encima de ellos. Pensé que tenía que pasar la variable en una acción y especificar donde iba a ir con el objetivo igual que en otros objetos, pero cuando las cosas antes de tiempo, usted no tiene que hacer eso. Ahora, habiendo dicho eso, dinámicamente la configuración de «whichChoice» no es tan fácil, sin mucho más pensado…pero poner a una variable CONOCIDA en el programa de instalación está bien.

    Para responder a #2, yo simplemente puse una variable estilo de IBOutlet en mi clase, la conecté a la tabla y, a continuación, seguido tus instrucciones, ya que sin la variable en el IBOutlet y conectarte a la mesa, no hay ninguna referencia a la vista de tabla. Por alguna razón enganchar encima de la mesa, simplemente, a la VISTA de «Referencia de Salida» y llamando a [self.tableview reloadData] no hacer el trabajo.

    Pero para la mayor parte, sus respuestas eran correctas y me llevó en la dirección correcta. Como un aparte, yo realmente odio que tienes a la derecha-haga clic y arrastre desde aquí a allí en IB si usted tiene un IB elemento construido. Usted debe ser capaz de conectarlo en el código usando el ObjectId (o algo así). Que estaría más en línea con los programadores. Sé IB está hecho para permitir que programación a ser más fácil para diseñadores, pero gee wilikers..es difícil para envolver mi mente alrededor! Me acaban de caer del IB y la creación de elementos en el código de la mayoría de de tiempo tiempo…que no sé si es tan rápido para ejecutar. Tiendo a pensar que no…pero no tiene ninguna prueba de lo contrario.

    OriginalEl autor Jann

  3. -1

    Por favor visite Cómo agregar UINavigationController mediante Programación

    Por favor visite el enlace de arriba & obtener toda la información relativa a UINavigationController.

    Esto no es muy útil. Con el fin de crear el ejemplo de arriba, me hizo leer la documentación. No se explicar lo que me estaba pidiendo.
    He intentar explicar los conceptos básicos solamente. Por favor, dime, ¿qué están buscando? Debo ayudar a usted.

    OriginalEl autor niceamitsingh

Dejar respuesta

Please enter your comment!
Please enter your name here