标签栏单击委托

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>

【讨论】:

以上是关于标签栏单击委托的主要内容,如果未能解决你的问题,请参考以下文章

如何将标签栏控制器放在视图控制器而不是委托中?

我在应用程序委托中加载的视图控制器(在导航控制器中)与标签栏重叠

无法将标签栏应用程序添加到 popToRootViewController

快速检查单击了哪个标签栏项目

我们如何在 Swift 中单击第一个 VC 时打开标签栏

标签栏/导航刷新