单击 UITabBarController 时的自定义操作

Posted

技术标签:

【中文标题】单击 UITabBarController 时的自定义操作【英文标题】:Custom action when clicking on UITabBarController 【发布时间】:2014-03-14 18:29:01 【问题描述】:

我有一个标签栏控制器,其中添加了四个导航控制器。导航控制器在标签栏控制器中显示为标签栏项目。现在我想向标签栏添加第五个按钮,它不会打开另一个视图,但会触发一些自定义代码。无论用户是四个页面中的哪一个,我都想在单击该选项卡栏项时显示一个覆盖的“共享菜单”。我该怎么做?

【问题讨论】:

【参考方案1】:

我可以建议将虚拟 UIViewController 添加到最后一个索引并处理 UITabBarControllerDelegate

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

    if ([viewController == ...your dummy view controller...]) 

        //Your custom action

        return NO;
    

    return YES;

【讨论】:

谢谢,看起来很棒。你会放什么而不是“你的虚拟视图控制器”?我可以用 ID 识别那个控制器吗? VC没有标识符,但是有很多方法可以识别它。例如。您可以将这个虚拟 VC 子类化,并将其命名为 DummyViewController。比简单的检查 [viewController isKindOfClass:[DummyViewController class]]; 你也可以在 shouldSelectViewController 中查看 viewController.tabBarItem.tag,它们的默认值都是 0。它可以在 storyboard 中设置。 谢谢,它看起来是正确的解决方案,我需要实现 TabBarController 吗?【参考方案2】:

Krivoblotsky 给出了正确的答案!我想为任何感到困惑的人详细说明一下,因为对于完整的实施,还有几个移动部分。假设您有下面的应用程序。当您单击主页或个人资料图标时,将显示相应的视图。假设您想要添加自定义转换/行为,而不是要显示的配置文件视图。

为此: 1. 给定 ProfileViewController 类,您希望在 ProfileViewController 中包含 UITabBarControllerDelegate

@interface ProfileViewController : ViewController <UITabBarControllerDelegate> @end

2。访问您的 tabBarcontroller 的委托并在 ProfileViewController.m 的 viewDidLoad 中将其设置为您自己

self.tabBarController.delegate = self;

这基本上是在说嘿,你知道 tabBarController 的委托吗? (处理事件的人)我认识一个人,让这个人(自己)处理这些事件。就像在英语中一样,您将工作委托给其他人(您是委托对象)。处理这项工作的是 DELEGATE。 3. 实现自定义所需的行为

-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:
    if ([viewController isKindOfClass:[ProfileViewController class]])
        NSLog(@"It's a profile");
        return NO ;
        ;
    else return YES; 

NO 返回表示,当 ProfileViewController 被选中时,不要执行默认行为并显示它的视图。

Excellent explanation of delegates

【讨论】:

【参考方案3】:

    在 Storyboard 中,添加一个 UIVIewController 并将其连接到您要执行自定义操作的选项卡按钮。

    给 UIViewController 一个唯一的标题。例如“用于自定义操作”。这真的没关系,因为没有人会看到这个标题。它仅供您在下面的代码中使用,以识别该选项卡被点击了。

    创建下面的类并将其分配给 Storyboard 中的 UITabBarController

    class TabBarController: UITabBarController, UITabBarControllerDelegate 
    
        override func viewDidLoad() 
            delegate = self
        
    
        func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool 
            if viewController.title == "for custom action" 
               //do your custom actions
               return false
            
            return true
         
    
     
    

【讨论】:

【参考方案4】:

您应该简单地实现以下UITabBarDelegate 方法:

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

【讨论】:

如果标签栏由标签栏控制器处理,则不允许这样做

以上是关于单击 UITabBarController 时的自定义操作的主要内容,如果未能解决你的问题,请参考以下文章

从 UITabBarController 调用 SFSafariViewController 并在按下“完成”后返回

具有滚动功能的自定义 UITabBarController

为啥由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器

在 UITabbarController 中切换选项卡时的 popToRoot UINavigationController

我可以通过 TabBarItem 上的自定义事件点击来制作自定义 UITabBarController 吗?

如何在 uitabbarcontroller 中的 uibutton 单击事件上推送其他视图控制器?