我有两个视图控制器(FirstViewController和SecondViewController)和一个Tab Bar Controller,我正在使用Storyboard。在FirstViewController中,用户可以拖放imageview。因此,每当用户点击显示SecondViewController的第二个TabBarItem时,我想检查用户是否每次单击TabBarItem时都删除了图像。
因此,我了解可以使用UITabBarDelegate
及其方法-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
来完成此操作。但我做错了,因为没有调用该方法,我相信这是因为我无法正确设置委托。所以我希望SecondViewController成为TabBarController的委托。
所以在我SecondViewController.h
我有以下
@interface SecondViewController : UIViewController<UITabBarDelegate>
在SecondViewController.m
我有
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
NSLog(@"%@", item);
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tabBarController.delegate = self;
}
但没有任何反应,在设置委托时我也收到编译器警告:从不兼容类型'SecondViewController * const __strong'
分配给'id'请温柔地对待我,这是我的第一个应用程序,也是我第一次尝试使用代表。
答案 0 :(得分:8)
将以下代码添加到任何视图控制器
UITabBarController *tabBarController = (UITabBarController*)[UIApplication sharedApplication].keyWindow.rootViewController ;
[tabBarController setDelegate:self];
//将任何委托方法添加到您的类
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
NSLog(@"%@", tabBarController);
}
答案 1 :(得分:3)
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
此方法是UITabBar的委托方法,而不是UITabBarController,所以
self.tabBarController.delegate = self;
无效。
标签栏控制器有自己的UITabBar,但是不允许更改由标签栏控制器管理的标签栏的委托,所以只需尝试使用UITabBarControllerDelegate方法:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
NSLog(@"%@", item);
}
有关详情,请查看info
由于
答案 2 :(得分:2)
我导入并实现了以下内容。希望它有所帮助。
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
if (_mainTab.selectedItem.tag == 1) {
NSLog(@"TAB 1");
}
else if (_mainTab.selectedItem.tag == 2) {
NSLog(@"TAB2");
}
else if (_mainTab.selectedItem.tag == 3)
{
NSLog(@"TAB3");
}
else
{
NSLog(@"TAB NOT WORKING");
}
}
答案 3 :(得分:1)
您使用的是错误的委托协议UITabBarDelegate
通常用于自定义UITabBar
个对象。您需要使用UITabBarControllerDelegate
协议来检查选项卡是否已选中或自定义选项卡的行为。
答案 4 :(得分:0)
您应该实现UITabBarControllerDelegate协议,并使用此委托回调来跟踪选择:
tabBarController:didSelectViewController:
接下来,你应该在调用委托之前初始化委托。在tabbarcontroller尝试与委托交谈后,将调用ViewDidLoad。
答案 5 :(得分:0)
为了摆脱编译器警告,您的SecondViewController
应符合UITabBarControllerDelegate
协议而不是UITabBarDelegate
协议。
@interface SecondViewController : UIViewController<UITabBarControllerDelegate>