【问题标题】: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

标签: iphone ios xcode


【解决方案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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-12
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          相关资源
          最近更新 更多