2009-07-15 7 views
0

je la question suivante:TabBarController NavigationController et UIViewController

Dans mon projet, j'ai la prochaine:

UITabBarController

.... Quelques UINAvigationControllers ....

* (1) UINavigationController

UIViewController (UItableView) - When select one row it goes to...(by push) to: 

       UIViewController (UItableView) - And here the same than before, for each row i open a new tableview.... 

Mon problème i s lorsque je clique dans l'élément de la barre d'onglets, je vois la vue viewController comme la dernière fois que j'ai vu cela, et aucun rechargement à la * (1) première vue une autre fois (comme je le voudrais)

Où j'ai besoin écrire sth pour chaque fois que je clique dans un élément de la barre d'onglets je recharge la première vue de cet élément de la barre d'onglets.

PD: J'ai l'appel: [theTableView reloadData]; dans la méthode "viewWillAppear". Ce que je fais est: Dans mon contrôleur de navigation j'ai un View Controller (comme vue de table) et quand je clique sur une rangée, dans la méthode "didSelectRowAtIndexPath" je crée un autre View Controller appelant "myController" et je pousse cet élément comme ceci ([[auto navigationController] pushViewController: myController animé: OUI];) Et ceci pour chaque fois que je clique dans une rangée dans les tableaux suivants.

Ensuite, je pense que le problème n'est pas de recharger la vue de la table dans la méthode viewWillAppear, c'est de sortir de l'écran le contrôleur de vues suivant que j'ai inséré à la racine.

Je suis la bonne?

EN REPRENDRE:

Mon application a la prochaine:

  • barre d'onglets pour se déplacer entre les écrans
  • Navigation à l'intérieur de chaque barre d'onglets (pour autant que vous voulez), pourquoi? parce que tous les tabBarItems affichent des tables, et si vous cliquez dans une rangée vous ouvrez une autre table, .....

Mon problème est alors que je voudrais revenir à la 1ère table principale quand je clique dans la barre d'onglets. Pour l'instant l'application ne le fait pas, elle continue dans les éboulis (vue de table) qui était la dernière visite dans cet onglet. (N'est pas complètement vrai, parce que si je clique deux fois, Oui, il revient mais ne pas entrer dans les méthodes "viewWillLoad" ou "didSelectViewController", parce que j'ai fait NSLogs et il ne les affiche pas).

Le sketche peut être ceci:

AppDelegate -> WelcomeScreen -> VideosTableViewController -> RElatedVideosTableViewController -> ..... ..... ....

La 1ère chose est de montrer l'écran de bienvenue (pas si important, seulement quelques boutons) et dans cette classe j'ai le TabBArController initialisé avec "localViewControllersArray" qui est un NSMutableArray de NavigationControllers chacun initialisé avec un ViewController.

Puis, quand je presse l'un des boutons de cet écran d'accueil i sho la barre d'onglet Contrôleur (Affiche le VideosTableViewController)

Dans l'étape suivante, lorsque je clique sur une ligne, dans « didSelectRowAtIndexPath » Je crée une RElatedVideosTableViewController, et je pousse ce par « [push [self NavigationController] ....: "La vue de table relatedvideo je crée" animé: OUI];

eT JE DOIS AUSSI:

Ajouter: UITabBarControllerDelegate Ajouter :

  • (void) tabBarController: (UITabBarController *) tabBarController didEndCustomizingViewControllers: (NSArray *) viewControllers changé: (BOOL) a changé {}

  • (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController {if ([viewController isKindOfClass: [UINavigationController classe]]) {[(UINavigationController *) viewController popToRootViewContro ller: NO]; [theTableView reloadData]; NSLog (@ "RELOAD"); }}

Et à l'initialisation de la classe: [super.tabBarController setDelegate: auto];

Mais dans la console, je ne vois pas le NSLog que je fais alors ne va pas dans cette méthode.

Répondre

1

Faites votre délégué application de délégué de la barre onglet commande, soit dans Interface Builder ou dans le code:

- (void)applicationDidFinishLaunching 
{ 
    ... 
    self.tabBarController.delegate = self; 
} 

Ensuite, lorsque les commutateurs de la barre d'onglet à un point de vue différent, vous obtenez informé, à quel point vous pop à la racine du contrôleur de navigation ainsi sélectionné:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
     if ([viewController isKindOfClass:[UINavigationController class]]) 
     { 
       [(UINavigationController *)viewController popToRootViewController:NO]; 
     } 
} 

Chaque contrôleur de vue doit avoir son propre point de vue de la table, donc je ne sais pas ce que vous essayez de faire le reload.

+0

Im essayant reload parce que je veux utiliser ceci pour appeler une méthode de conection chaque fois que je montre les tables. –

+0

J'ai ajouté ceci à mon code, continuer à faire de même, sans entrer dans la méthode didSelectViewController. Notez que entre mon appdelegate et le reste, j'ai un viewcontroller welcomeScreen, puis où je déclare le tabbarcontrolelr et où je mets la ligne: self.tabbarController.delegate = self; est dans cette classe. Je ne sais pas si cela fait une différence. –

+0

Placez un point d'arrêt sur la ligne où vous définissez le délégué. Si ça ne s'appelle pas, vous devez (évidemment) le mettre ailleurs. Peut-être que vous le mettez dans une méthode init qui n'est pas appelée. –

0
  • (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController {NSLog (@ "Dans WelcomeScreen -> didSelectViewController");

    if ([viewController isKindOfClass: [UINavigationController classe]]) { NSLog (@ "Dans WelcomeScreen -> IF -> didSelectViewController"); [(UINavigationController *) viewController popToRootViewController: OUI]; NSLog (@ "Entrée WelcomeScreen -> IF -> didSelectViewController");

    } NSLog (@ "Out WelcomeScreen -> didSelectViewController"); }

J'ai: * Mettre fin application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: « * - [UINavigationController popToRootViewController:]: sélecteur non reconnu envoyé à l'instance

+0

Nos je suis tellement confus. Dois-je mettre le code pour cette méthode et le <...Delegate> dans la classe qui a le UITabBArController * ou puis-je le faire dans un type "sous-classe" UIViewController ?? –

Questions connexes