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:
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?
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
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. –