2009-10-27 12 views
3

J'ai actuellement une application iPhone avec une barre d'onglets et plusieurs viewcontrollers. Toutes les vues sont conçues dans Interface Builder. Je voudrais pouvoir obtenir l'index actuellement sélectionné de la barre d'onglets à partir du viewcontroller, mais pour une raison quelconque, cette propriété renvoie (null).Obtenir le selectedIndex de l'onglet sélectionné à partir d'une viewcontroller

J'ai appelé le suivant dans la fonction viewDidLoad de mon viewcontroller:

self.tabBarController.selectedIndex

Quelle serait la bonne façon de le faire?

mis à jour avec le code de la classe AppDelegate.

MyAppDelegate.h

#import <UIKit/UIKit.h> 

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 
    UIWindow *window; 
    UITabBarController *tabBarController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; 

@end 

MyAppDelegate.m:

#import "MyAppDelegate.h" 

@implementation MyAppDelegate 

@synthesize window, tabBarController; 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    [window addSubview:tabBarController.view]; 
} 

- (void)dealloc { 
    [tabBarController release]; 
    [window release]; 
    [super dealloc]; 
} 

@end 
+0

Quelle est la valeur de tabBarController et sinon nulle quelle classe est-il pointe. – zaph

+0

J'espère que je comprends bien ce que vous voulez dire. Je suis tout à fait le novice, ce qui doit être plutôt évident à partir de ma question initiale. Quoi qu'il en soit, [classe self.tabBarController] renvoie UITabBarController, ce qui est normal, n'est-ce pas? – mensch

Répondre

4

Vous devriez avoir un pointeur vers votre barre d'onglets dans votre classe appDelegate. Votre vue n'a pas de tabulation, donc vous ne recevez rien de [self.tabBarController selectedIndex].

+0

Comment puis-je faire cela? Il y a un pointeur sur tabBarController dans la classe. J'ai mis à jour la question avec le code de la classe appDelegate. – mensch

+1

myAppDelegate * getAppDelegate() { \t retour (myAppDelegate *) [UIApplication sharedApplication] .delegate; } vous pouvez ajouter cette méthode à votre classe appdelegate et appeler votre tabbar par getAppDelegate(). TabBarController – Morion

+0

Est-ce la même chose que: MyAppDelegate * appDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; NSLog (@ "% @", appDelegate.tabBarController.selectedIndex); Parce que cela renvoie (null) aussi, j'ai peur. Et l'application se bloque lors du passage à une autre section de l'onglet – mensch

0

Je pense que je l'ai. En utilisant les rendements suivants l'indice correct:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSLog(@"%d", appDelegate.tabBarController.selectedIndex); 

La raison pour laquelle l'application plantait était le fait que je% au lieu de @% d dans la partie NSLog. J'aurais juré que j'ai essayé d% avant, étrange ...

L'indice est maintenant retourné, mais une seule fois. Après avoir appuyé sur l'onglet, un numéro d'index est renvoyé, mais lorsque vous appuyez à nouveau sur une autre section, aucun numéro n'est imprimé. Probablement parce que la vue a déjà été chargée une fois. Y a-t-il un moyen de contourner cela?

+1

Utilisez une méthode différente? viewDidLoad est le rappel que le système utilise pour indiquer à votre contrôleur de vue que sa vue vient d'être chargée (que ce soit à partir d'un fichier nib, ou du code dans loadView, ou autre). Il peut être appelé plusieurs fois au cours de la vie du contrôleur, mais seulement si la vue a été déchargée à un moment donné (par exemple, par un avertissement de faible mémoire). Peut-être cherchez-vous quelque chose comme viewWillAppear:? –

+0

En outre, ce type de clarification devrait vraiment être une modification à la question, pas une réponse. –

+0

Désolé, je vais éditer la question racine à partir de maintenant. Merci pour le pointeur viewDidLoad, examinera cela. – mensch

Questions connexes