2012-06-08 39 views
7

在我的头文件我有这样的:的TabBar didSelectItem似乎并没有被工作

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

    IBOutlet UITabBarController *tabBarController; 

} 

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

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

@end 

在我的主要文件,我有这样的:

@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 

我已经连接了我的tabbarcontroller作为代表到我的文件的所有者在界面构建器中,但它仍然不会调用didSelectItem方法。

有什么,我在这里失踪?

我已经添加了tabBarController.delegate = self;,它仍然不起作用。

+1

如果你以编程的方式做什么? I. e。,'tabBarController.delegate = self;'? – 2012-06-08 09:16:45

+0

它STIL不工作:( –

回答

1

你需要补充一点:

tabbarcontroller.delegate = self; 
+0

尝试添加: - (无效)viewDidLoad中{ \t [超级viewDidLoad中]; \t tabBarController.delegate =自我; \t self.view = tabBarController.view; } 仍然不起作用 –

0

你合成的标签栏,所以你现在需要写:self.tabBarController.delegate = self;

+0

尝试添加: - (无效)viewDidLoad中{ \t [超级viewDidLoad中]; \t self.tabBarController.delegate =自我; \t self.view = tabBarController.view; } 仍然不起作用 –

0

刚刚成立的标签栏的委托。您可以通过设置self.tabBarController.delegate = self;或使用界面构建器对tabbarcontroller对象(不是栏)来执行此操作,请参阅连接检查器并将连接拖放到文件的所有者上。

+0

已经做到了,但它仍然不起作用 –

+0

大概我想通了。如果你想要那个方法 - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;被称为你应该设置tabbar委托属性为self。所以试试类似self.tabBarController.tabBar.delegate = self; – Andrea

+0

它不起作用,如果我把self.tabBarController.tabBar.delegate = self;在viewDidLoad中。它给了我一个错误 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'更改由标签栏控制器管理的标签栏的委托是不被允许的。 –

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

这种方法是UITabBar,不是的UITabBarController委托方法,因此

self.tabBarController.delegate = self; 

将无法​​正常工作。

标签栏控制器都有自己的UITabBar,但改变一个标签栏控制器管理的标签栏的代表是不允许的,所以只是尝试UITabBarControllerDelegate方法是这样的:

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

不要忘记添加''到你的应用程序委托的.h和'UITabBarController * tabBarController =(UITabBarController *)self.window.rootViewController; tabBarController.delegate = self;'在'didFinishLaunchingWithOptions'方法中。 – Patrick

-1

原因是多方面的,如上所述,为什么它可能不工作。这是一个更微妙的原因。如果您以编程方式创建UI(无故事板或Xib),则需要设置UIWindow的屏幕。

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

如果您使用Xib,我相信这相当于选择了“全屏启动”。必须检查,或者我注意到我的标签不起作用。

更新:不管怎么样,如果你必须向下投票,但我有一个非工作的选项卡控制器,这是我必须做的,以使其工作。这个页面上的其他答案没有帮助我。我想现在使用xib/storyboard是非常罕见的(我认为这是iOS 5天),但是离开这里是为了这个人,并且陷入这种情况。

1

使用UITabBarControllerDelegate而不是UITabBarDelegate
-tabBarController:didSelectViewController{}代替tabBar:didSelectItem{}

接口

@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

我自己刚刚遇到了这个问题,而且这个解决方案非常完美。谢谢! – CodeNoob