我有一个标签栏控制器,其中添加了四个导航控制器。导航控制器在选项卡栏控制器中显示为选项卡栏项目。现在我想在标签栏中添加第五个按钮,它不会打开另一个视图,但会触发一些自定义代码。我想在单击该标签栏项时显示一个重叠的“共享菜单”,无论用户在哪四个页面中。我怎么能这样做?
答案 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)
在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
}
}
答案 2 :(得分:0)
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时,不要执行默认行为并显示它的视图。
答案 3 :(得分:-1)
您应该简单地实现以下UITabBarDelegate
方法:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;