我有一个基于标签栏的应用。所有选项卡都有一个导航控制器作为根。 如果用户在选项卡处于活动状态时再次点击选项卡,则会弹回导航控制器 我怎么能阻止这种行为?
这是一些更新:
所以实际上我有一个导航控制器+一个隐藏的视图控制器,可以做出一些决定+另一个视图控制器。对于原始问题中的误导性信息,我们深表歉意。我使用隐藏的viewcontroller用于所有标签,其中3个,因为如果用户没有登录,我在所有3个登录屏幕上。如果用户登录,则弹出登录屏幕,然后放入1,2 ,每个选项卡上有3个独立的视图控制器。
首先点击:
0 : class=Crossing: 0x645c8a0>
1 : class=FavoritesViewController: 0x64ac140>
shouldSelectViewController : UINavigationController
UINavigationController topclass:FavoritesViewController
myTabBarController.selectedViewController :UINavigationController
did disappear
didSelectViewController : UINavigationController
UINavigationController topclass:FavoritesViewController
第二次点击:
0 : class=Crossing: 0x645c8a0>
1 : class=FavoritesViewController: 0x64ac140>
shouldSelectViewController : UINavigationController
UINavigationController topclass:FavoritesViewController
myTabBarController.selectedViewController :UINavigationController
didSelectViewController : UINavigationController
UINavigationController topclass:Crossing
答案 0 :(得分:7)
@MarkGranoff在这方面做得很好,但是做到这一点的方法是做这样的事情:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if ([tabBarController.viewControllers indexOfObject:viewController] == tabBarController.selectedIndex)
{
return NO;
}
else
{
return YES;
}
}
或以不那么冗长的方式:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
return (viewController != tabBarController.selectedViewController);
}
如果您只想阻止某个标签的默认行为,那么您可以执行以下操作:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
NSUInteger indexOfNewViewController = [tabBarController.viewControllers indexOfObject:viewController];
// Only the second tab shouldn't pop home
return ((indexOfNewViewController != 1) ||
(indexOfNewViewController != tabBarController.selectedIndex));
}
答案 1 :(得分:2)
Swift 3
对您的UITabBarController
进行细分,并在该课程上实施UITabBarControllerDelegate
。
class viewMain: UITabBarController, UITabBarControllerDelegate {
在viewDidLoad
中,将您的班级委托设置为
self.delegate = self
添加此功能
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
return (viewController != tabBarController.selectedViewController);
}
答案 2 :(得分:1)
在您的应用程序委托(我假设是您的UITabBarController的委托)中,尝试实现tabBarController:shouldSelectViewController:
并在要选择的视图控制器不在其根视图时返回NO。当然,这可能适用于当你试图回到它们时切换远的标签......嗯.......
答案 3 :(得分:0)
您可以在
中检查视图控制器- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
您可以跟踪所选的视图控制器。
答案 4 :(得分:0)
更新Swift 4.1
停止双击只有一个特定的选项卡。这是第3个标签页。
field.getValue()
停止双击所有标签。
extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
//for blocking double tap on 3rd tab only
let indexOfNewVC = tabBarController.viewControllers?.index(of: viewController)
return ((indexOfNewVC != 2) ||
(indexOfNewVC != tabBarController.selectedIndex))
}}
谢谢!