【发布时间】:2014-03-14 18:29:01
【问题描述】:
我有一个标签栏控制器,其中添加了四个导航控制器。导航控制器在标签栏控制器中显示为标签栏项目。现在我想向标签栏添加第五个按钮,它不会打开另一个视图,但会触发一些自定义代码。无论用户是四个页面中的哪一个,我都想在单击该选项卡栏项时显示一个覆盖的“共享菜单”。我该怎么做?
【问题讨论】:
标签: ios objective-c uitabbarcontroller uitabbaritem tabbarcontroller
我有一个标签栏控制器,其中添加了四个导航控制器。导航控制器在标签栏控制器中显示为标签栏项目。现在我想向标签栏添加第五个按钮,它不会打开另一个视图,但会触发一些自定义代码。无论用户是四个页面中的哪一个,我都想在单击该选项卡栏项时显示一个覆盖的“共享菜单”。我该怎么做?
【问题讨论】:
标签: ios objective-c uitabbarcontroller uitabbaritem tabbarcontroller
我可以建议将虚拟 UIViewController 添加到最后一个索引并处理 UITabBarControllerDelegate
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
if ([viewController == ...your dummy view controller...]) {
//Your custom action
return NO;
}
return YES;
}
【讨论】:
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 被选中时,不要执行默认行为并显示它的视图。
【讨论】:
在 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
}
}
【讨论】:
您应该简单地实现以下UITabBarDelegate 方法:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
【讨论】: