单击UITabBarController时的自定义操作

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

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

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { if ([viewController == ...your dummy view controller...]) { //Your custom action return NO; } return YES; } 
  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 } } 

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

样品申请

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

 @interface ProfileViewController : ViewController  @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时,不执行默认行为并显示它的视图。

代表们的出色解释

您应该只是实现以下UITabBarDelegate方法:

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