单击 UITabBarController 时的自定义操作
Posted
技术标签:
【中文标题】单击 UITabBarController 时的自定义操作【英文标题】:Custom action when clicking on UITabBarController 【发布时间】:2014-03-14 18:29:01 【问题描述】:我有一个标签栏控制器,其中添加了四个导航控制器。导航控制器在标签栏控制器中显示为标签栏项目。现在我想向标签栏添加第五个按钮,它不会打开另一个视图,但会触发一些自定义代码。无论用户是四个页面中的哪一个,我都想在单击该选项卡栏项时显示一个覆盖的“共享菜单”。我该怎么做?
【问题讨论】:
【参考方案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】:在 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
【讨论】:
【参考方案4】:您应该简单地实现以下UITabBarDelegate
方法:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
【讨论】:
如果标签栏由标签栏控制器处理,则不允许这样做以上是关于单击 UITabBarController 时的自定义操作的主要内容,如果未能解决你的问题,请参考以下文章
从 UITabBarController 调用 SFSafariViewController 并在按下“完成”后返回
为啥由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器
在 UITabbarController 中切换选项卡时的 popToRoot UINavigationController