2012-06-08 17 views
7

En mi archivo de cabecera tengo esto:TabBar didSelectItem parece no estar funcionando

@interface TabBarController : UIViewController <UIApplicationDelegate, UITabBarDelegate, UITabBarControllerDelegate>{ 

    IBOutlet UITabBarController *tabBarController; 

} 

-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item; 

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

@end 

En mi archivo principal que tengo esto:

@synthesize tabBarController; 

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    self.tabBarController.delegate = self; 
    self.view = tabBarController.view; 
} 

-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{ 
    NSLog(@"rawr"); 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

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


@end 

ya he conectado mi tabbarcontroller como delegado el propietario de mi archivo en el generador de interfaz, pero todavía no llama al método didSelectItem.

¿Hay algo que me falta aquí?

Ya he agregado tabBarController.delegate = self; y todavía no funciona.

+1

¿Qué sucede si lo haces mediante programación? I. e., 'TabBarController.delegate = self;'? –

+0

que stil no funciona :( –

Respuesta

1

es necesario agregar esto:

tabbarcontroller.delegate = self; 
+0

intentado añadir: - (void) {viewDidLoad \t [súper viewDidLoad]; \t tabBarController.delegate = sí; \t self.view = tabBarController.view; } todavía no funciona –

0

Usted ha sintetizado la barra de pestañas, por lo que ahora es necesario escribir: self.tabBarController.delegate = self;

+0

intentado añadir: - (void) viewDidLoad { \t [sUPER viewDidLoad]; \t self.tabBarController.delegate = auto; \t self.view = tabBarController.view; } todavía no funciona –

0

acaba de establecer el delegado de la barra de pestañas. Puede hacerlo estableciendo self.tabBarController.delegate = self; o usando el constructor de interfaz do al objeto tabbarcontroller (no barra) vea el inspector de conexión y arrastre la conexión al propietario del archivo.

+0

ya lo hice, pero todavía no funciona –

+0

Probablemente lo descubrí. Si desea que el método - (void) tabBar: (UITabBar *) tabBar didSelectItem: (UITabBarItem *) artículo; para ser llamado debe establecer la propiedad de delegado tabbar en self. Intente algo como eso self.tabBarController.tabBar.delegate = self; – Andrea

+0

no funciona, si pongo self.tabBarController.tabBar.delegate = self; en viewDidLoad. me da un error Aplicación de terminación debido a la excepción no detectada 'NSInternalInconsistencyException', razón: 'No se permite cambiar el delegado de una barra de pestañas administrada por un controlador de la barra de pestañas'. –

15
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item; 

Este método es un método delegado de UITabBar, no UITabBarController, por lo

self.tabBarController.delegate = self; 

no va a funcionar.

controlador de barra de pestañas tiene su propio UITabBar, pero no se le permite cambiar el delegado de una barra de pestañas gestionado por un controlador de la barra de pestañas, por lo que sólo tratar método UITabBarControllerDelegate así:

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

No olvide agregar '' al .h del delegado de su aplicación y algo como 'UITabBarController * tabBarController = (UITabBarController *) self.window.rootViewController; tabBarController.delegate = self; 'en el método' didFinishLaunchingWithOptions'. – Patrick

-1

Hay muchas razones, como se indicó anteriormente, por qué podría no estar funcionando. Aquí hay una razón más sutil. Si está creando su UI programáticamente (sin storyboard o Xib), necesita configurar la pantalla de su UIWindow.

self.window = [[UIWindow alloc] init]; 
self.window.screen = [UIScreen mainScreen]; // <- The UITabViewController will not 
              // accept taps without this. 

Si está utilizando un Xib, creo que esto es equivalente a tener "Pantalla completa al inicio" seleccionada. Eso tiene que verificarse o me he dado cuenta de que mis pestañas no funcionan.

Actualización: Lo que sea, vuélvame a votar si debe hacerlo, pero yo tenía un controlador de pestañas que no funcionaba y esto es lo que tenía que hacer para ponerlo en funcionamiento. Ninguna de las otras respuestas en esta página me ayudó. Supongo que usar un xib/storyboard es bastante raro en estos días (creo que esto fue de iOS 5 días) pero dejarlo aquí para la persona que lo hace y tropezar con esta situación.

1

Uso UITabBarControllerDelegate en lugar de UITabBarDelegate y
-tabBarController:didSelectViewController{} en lugar de tabBar:didSelectItem{}

interfaz

archivo principal
@interface TabBarController : UIViewController <UIApplicationDelegate, UITabBarControllerDelegate, UITabBarControllerDelegate>{ 

    IBOutlet UITabBarController *tabBarController; 
} 
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; 
@end 

@implementation TabBarController 
    @synthesize tabBarController; 

    /*other stuff*/ 
    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 
     NSLog(@"rawr"); 
    } 
    /*other stuff*/ 
@end 
+1

Me encontré con este problema yo mismo, y esta solución funciona perfectamente. ¡Gracias! – CodeNoob

Cuestiones relacionadas