Lorsque “par programme” création UINavigationController et UITabBarController, comment dois-je m'adresser à leurs fonctions (comme viewWillAppear?)
Je suis entrain de créer mon Nav et TabBar dans le code au lancement via:
DANS : 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=@"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=@"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=@"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 le voyez, je suis re-à l'aide de ResortsListViewController pour différentes catégories affiche (stations avec des Plages, des stations avec des Piscines, des centres de villégiature avec des bars à expresso) ... maintenant, sans me harcèle (sourire) à propos de la bêtise de mes catégories (cos c'est une application de test) j'ai besoin de besoin de faire plusieurs choses:
-
J'ai besoin de savoir dans quel onglet, cliquez sur a causé la ResortsListViewController à être affiché. J'espérais utiliser la BALISE, mais "initWithRootViewController" n'ont pas le "tag" de contrôle. Donc, si j'utilise un imagefilename qui est le nom de la catégorie, je peux utiliser le nom du fichier à distinguer des catégories...ou même navigationItem nom. J'ai besoin de savoir si il existe un moyen pour ResortsListViewController de savoir qui tabbar élément, cliquez sur l'a causé d'affichage. J'ai pensé à regarder pour une "action" que je pourrais attribuer à la tabbar élément, mais ce n'est pas la façon tabbarcontroller œuvres.
-
Lorsque vous cliquez sur à partir d'un onglet à l'autre, de la vue, en effet, le changement, le titre de ResortsListViewController changements, etc...mais la TABLEVIEW qu'elle détient ne sont pas claires et affichage de toutes les nouvelles données. La recherche sur le web j'ai trouvé une solution possible:
http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0
ce qui revient à dire:
Pour UINavigationControllers
pour envoyer
"viewWill/A/Apparaître/Disparaître"
messages, il doit avoir reçu
"viewWill/A/Apparaître/Disparaître" de
de son contenant.
Qu'est-ce que le conteneur pour mon UINavigationControllers dans cette situation? myAppDelegate est défini dans la .h du fichier:
NSObject <UIApplicationDelegate, CLLocationManagerDelegate>
et n'ont pas d':
- (void)viewWillAppear:(BOOL)animated {
}
section. Quand j'en ajouter un, il dit: "NSObject peut ne pas répondre à viewWillAppear" dans le débogueur.
Aucune aide là-bas?
OriginalL'auteur Jann | 2010-02-07
Vous devez vous connecter pour publier un commentaire.
1) C'est assez simple. Vous devez définir le délégué propriété pour la UITabBarController. Vous devrait être fixé à l'objet contrôleur qui est propriétaire de votre tabbarcontroller (ou votre délégué d'application si c'est votre configuration). Quel objet est définie comme le délégué a ensuite recevoir:
ET
pour gérer l'onglet sélections. Placez l'une de ces méthodes dans la mise en œuvre de n'importe quel objet que vous définissez en tant que délégué (vous souhaitez qu'il soit l'objet qui possède tous les contrôleurs).
2) Si vous avez un UIViewController qui apparaît comme un onglet de sélection (comme ResortsListViewController) ensuite, vous devez mettre le viewWillAppear méthode dans le contrôleur de mise en œuvre vous-même:
Laissez-moi savoir si j'ai mal compris la deuxième partie de votre question.
Votre appDelegate ne devriez pas répondre à viewWillAppear si c'est un NSObject (comme il l'est dans les norme Xcode modèle). Vous avez mentionné: ResortsListViewController *resortsListViewController. Le fichier où elle est mise en œuvre est l'endroit où vous voulez mettre votre viewWillAppear méthode.
OriginalL'auteur Matthew McGoogan
Bon, va ici: Ce est la bonne réponse à la question, cependant, il n'a pas à la fin de ce dur. Tout ce que j'avais à faire était la suivante:
Créer une propriété dans ResortViewController de type int avec le nom de la variable whichChoice (par exemple). Puis l'adresse d'installation de la TabBarController à la:
Pour trouver l'onglet qui a été cliqué quand mon resortsListViewController prend le dessus, j'ai simplement requête de la variable de classe: whichChoice pour obtenir la réponse.
Ce genre de choses sont si simples que vous passez sur eux. J'ai pensé que vous deviez passer la variable dans une action et spécifier l'endroit où il irait avec le cible comme vous le faites dans d'autres objets, mais lorsque vous définissez les choses à l'avance du temps que vous n'avez pas à le faire. Maintenant, cela étant dit, la définition dynamique de "whichChoice" n'est pas si facile, sans beaucoup plus de réflexion...mais la définition d'une variable CONNUE lors de l'installation c'est bien.
Pour répondre #2, j'ai simplement mis une variable de style de IBOutlet dans ma classe, accroché jusqu'à la table, puis suivi vos instructions, parce que sans la variable dans le IBOutlet et le connecter à la table, il n'y a aucune référence à la vue de la table. Pour une raison quelconque accrochage de la table simplement à la VUE de Référencement de Sortie" et appelant
[self.tableview reloadData]
ne pas faire le travail.Mais pour la plupart, vos réponses étaient justes et m'a conduit dans la bonne direction. En aparté, j'ai vraiment la haine que vous avez à droite de la souris et faites glisser à partir d'ici-là, dans l'IB si vous avez un IB de l'élément que vous avez construit. Vous devriez être en mesure de le brancher dans le code en utilisant son ObjectId (ou quelque chose). Qui serait plus en ligne avec les programmeurs. Je sais que IB est faite pour permettre à programmation être plus facile pour concepteurs, mais gee wilikers..il est difficile pour envelopper mon esprit autour de! Je finis par laisser tomber de l'IB et de créer des éléments dans le code le plus de temps en temps...je ne sais pas si c'est aussi rapide à exécuter. J'ai tendance à penser que non...mais n'ont aucune preuve à l'effet contraire.
OriginalL'auteur Jann
Veuillez visiter Comment ajouter UINavigationController par programmation
Veuillez visiter le lien ci-dessus & obtenir toutes les informations concernant UINavigationController.
J'ai essayer d'expliquer les notions de base seulement. S'il vous plaît dites-moi ,quels sont à la recherche? Je dois vous aider.
OriginalL'auteur niceamitsingh