5

Je crée mon Nav et TabBar dans le code lors de son lancement via: IN: myAppDelegate.m"programme" création UINavigationController et UITabBarController, comment puis-je faire face à leurs fonctions (comme viewWillAppear?)

- (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"]; 
    [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"]; 
    [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]; 


} 

Comme vous voyez, je réutilise ResortsListViewController pour différents affichages de catégorie (stations avec des plages, stations avec des piscines, stations avec des barres d'expresso) ... maintenant, sans me harceler (sourire) au sujet de la bêtise de mes catégories (cos ceci est un essai app) J'ai besoin de faire plusieurs choses:

  1. J'ai besoin de savoir quel onglet a provoqué l'affichage de ResortsListViewController. J'espérais utiliser TAG mais "initWithRootViewController" n'a pas le contrôle "tag". Donc, si j'utilise un nom de fichier image qui est le nom de la catégorie, je peux utiliser ce nom de fichier pour distinguer les catégories ... ou même le nom de navigationItem. J'ai besoin de savoir s'il existe un moyen pour ResortsListViewController de savoir quel clic sur l'élément de la barre de tabulation a provoqué son affichage. J'ai pensé à chercher une "action" que je pourrais assigner à l'élément tabbar, mais ce n'est pas la façon dont tabbarcontroller fonctionne. Lorsque vous cliquez d'un onglet à un autre, la vue change, le titre de ResortsListViewController change, etc ... mais le TABLEVIEW qu'il contient ne s'efface pas et affiche de nouvelles données. Recherche sur le Web, j'ai trouvé une solution possible:

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

essentiellement en disant:

Pour UINavigationControllers à envoyer "viewWill/did/Apparaître/Disparaître" messages , il doit avoir reçu "viewWill/Did/Appear/Disappear" à partir de son conteneur.

Quel est le conteneur pour mes contrôleurs UINavigation dans cette situation? myAppDelegate est défini dans le fichier .h comme:

NSObject <UIApplicationDelegate, CLLocationManagerDelegate> 

et n'a pas:

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

. Quand j'en ajoute un, il est dit que "NSObject ne peut pas répondre à -viewWillAppear" dans le débogueur.

Une aide?

Répondre

1

Bon, voilà: est la bonne réponse à la question, cependant, il n'a pas été si difficile. Tout ce que j'avais à faire était le suivant:

Créer une propriété dans ResortViewController de type int avec le nom de variable whichChoice (par exemple). adresse ensuite dans la configuration du 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"]; 
    [email protected]"Category1"; 
    localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController]; 
    [localControllersArray addObject:localNavigationController]; 
    [localNavigationController release]; 

Pour en savoir quel onglet a été cliqué quand mon resortsListViewController prend le relais, je simplement Interrogation de la variable de classe: whichChoice pour obtenir la réponse.

Des choses comme celles-ci sont si simples que vous les ignorez. Je pensais que vous deviez passer la variable dans une action et spécifier où il irait avec la cible comme vous le faites dans d'autres objets - mais lorsque vous configurez les choses à l'avance, vous n'avez pas à le faire. Maintenant, après avoir dit cela, mettre dynamiquement "quel Choix" n'est pas si facile sans beaucoup plus de réflexion ... mais en le réglant sur une variable CONNUE à l'installation, c'est bien. Pour la réponse 2, j'ai simplement mis un style variable d'IBOutlet dans ma classe, je l'ai accroché à la table, puis j'ai suivi vos instructions, parce que sans la variable dans l'IBOutlet et l'accrochant à la table, il y a n'est pas une référence à la vue de la table. Pour une raison quelconque, accrocher la table simplement à la vue "Outlet de référence" et en appelant le [self.tableview reloadData] n'a pas fait le travail. Mais pour l'essentiel, vos réponses étaient justes et m'ont conduit dans la bonne direction. En aparté, je déteste vraiment que vous deviez faire un clic droit et glisser d'ici à là dans IB si vous avez un élément IB que vous avez construit. Vous devriez être en mesure de le brancher dans le code en utilisant son ObjectId (ou quelque chose). Ce serait plus en ligne avec les programmeurs. Je sais IB est fait pour permettre programmation pour être plus facile pour designers, mais gee wilikers ..il est difficile d'envelopper mon esprit! Je finis par abandonner IB et créer des éléments dans le code la plupart du temps ... ce que je ne sais pas si est aussi rapide à exécuter. J'ai tendance à ne pas penser ... mais je n'ai aucune preuve du contraire.

2

1) Ceci est assez simple. Vous devez définir la propriété délégué pour le UITabBarController. Vous devez définir ceci à l'objet contrôleur qui possède votre tabbarcontroller (ou votre délégué d'application si c'est votre configuration). Quel que soit l'objet est défini comme le délégué recevrait alors:

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

ET

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

pour gérer les sélections de l'onglet. Placez l'une de ces méthodes dans l'implémentation de l'objet que vous avez défini en tant que délégué (vous souhaiterez qu'il soit l'objet propriétaire de tous les contrôleurs).

2) Si vous avez un UIViewController qui apparaît comme une sélection des onglets (comme ResortsListViewController), vous devrez mettre la méthode viewWillAppear dans la mise en œuvre du contrôleur vous:

@implementation ResortsListViewController 

- (id)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle { 
... 
} 

... etc. .... 

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
[table reloadData]; 
} 

... 

@end 

Permettez-moi Sachez si j'ai mal compris la deuxième partie de votre question.

+0

Je vais essayer ça. Je vous le ferai savoir le dimanche (dimanche). La deuxième partie est assez confuse car je peux ajouter viewWillAppear XCode ne le remplira pas automatiquement et il avertit que "myAppDelegate" ne répondra pas à -viewWillAppear. Comprendre? – Jann

+0

Votre appDelegate ne doit pas répondre à viewWillAppear s'il s'agit d'un objet NSObject (comme dans tout modèle Xcode standard). Vous avez mentionné: ResortsListViewController * resortsListViewController. Le fichier où cela est implémenté est l'emplacement où vous souhaitez placer votre méthode viewWillAppear. –

-1

S'il vous plaît visitez How to add UINavigationController Programmatically

S'il vous plaît visitez lien ci-dessus & obtenir toutes les informations concernant UINavigationController.

+1

Ce n'est pas utile.Afin de créer l'exemple ci-dessus, j'ai effectivement lu les documents. Ils n'expliquent pas complètement ce que je demandais. – Jann

+0

J'ai essayé d'expliquer les bases seulement. S'il vous plaît dites-moi, que cherchez-vous? Je dois vous aider. – niceamitsingh

Questions connexes