标签栏单击委托
Posted
技术标签:
【中文标题】标签栏单击委托【英文标题】:tab bar click delegate 【发布时间】:2013-06-13 20:47:10 【问题描述】:我有两个视图控制器(FirstViewController 和 SecondViewController)和一个标签栏控制器,我正在使用 Storyboards。在 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;
但是没有任何反应,在设置委托时,我还收到编译器警告:Assigning to 'id' from in compatible type 'SecondViewController *const __strong'
请对我温柔一点,这是我的第一个应用,也是我第一次尝试使用委托。
【问题讨论】:
要在 Swift 中使用UITabBarController
检测水龙头,请参阅this question
【参考方案1】:
将以下代码添加到任何视图控制器中
UITabBarController *tabBarController = (UITabBarController*)[UIApplication sharedApplication].keyWindow.rootViewController ;
[tabBarController setDelegate:self];
// 将任何委托方法添加到您的类中
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
NSLog(@"%@", tabBarController);
【讨论】:
这使它起作用,并且正如你们中的许多人指出的那样,还将委托更改为 UITabBarControllerDelegate。只是想知道为什么 self.tabBarController.delegate = self 不起作用?另外在什么情况下我可以使用 UITabBarDelegate? tabBarController 仅存在于您的 appDelegate 中,当您查看情节提要 viewController1 和 viewController2 时没有该对象。当您的调用 self.tabBarController 不存在时,因为它在调用类中查找。 UITabBarDelegate 类为用户提供了仅对标签栏重新排序、删除和添加项目的能力 非常感谢!真的很感激!【参考方案2】: -(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
谢谢
【讨论】:
【参考方案3】:我导入并实现了以下内容。希望对您有所帮助。
- (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");
【讨论】:
【参考方案4】:您使用了错误的委托协议 UITabBarDelegate
通常用于自定义 UITabBar
对象。您需要使用UITabBarControllerDelegate
协议来检查是否选择了选项卡或自定义选项卡的行为。
【讨论】:
【参考方案5】:您应该实现 UITabBarControllerDelegate 协议,并使用此委托回调来跟踪选择:
tabBarController:didSelectViewController:
接下来的事情是,您应该在调用之前初始化委托。 ViewDidLoad 将在 tabbarcontroller 尝试与委托对话后调用。
【讨论】:
首先,tabBarController:didSelectViewController:
是tabBarController:didSelectViewController:
的一个方法,如果你不实现这个方法,你会得到一个不同的警告。其次,SO所说的警告与delegate的错误类型有关。【参考方案6】:
为了摆脱编译器警告,您的SecondViewController
应符合UITabBarControllerDelegate
协议而不是UITabBarDelegate
协议。
@interface SecondViewController : UIViewController<UITabBarControllerDelegate>
【讨论】:
以上是关于标签栏单击委托的主要内容,如果未能解决你的问题,请参考以下文章
我在应用程序委托中加载的视图控制器(在导航控制器中)与标签栏重叠