单击UITabBarController时的自定义操作

时间:2014-03-14 18:29:01

标签: ios objective-c uitabbarcontroller uitabbaritem tabbarcontroller

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

4 个答案:

答案 0 :(得分:18)

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

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

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

        //Your custom action

        return NO;
    }

    return YES;
}

答案 1 :(得分:1)

  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
         }
    
     }
    

答案 2 :(得分:0)

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

Sample application

要做到这一点: 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)

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

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