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

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

【问题讨论】:

    标签: ios objective-c uitabbarcontroller uitabbaritem tabbarcontroller


    【解决方案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】:
      1. 在 Storyboard 中,添加一个 UIVIewController 并将其连接到您要执行自定义操作的选项卡按钮。

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

      3. 创建下面的类并将其分配给 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;
        

        【讨论】:

        • 如果标签栏由标签栏控制器处理,则不允许这样做
        猜你喜欢
        • 2012-05-03
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        相关资源
        最近更新 更多