防止IOS中tabbar在特定索引处更改选项卡

19

感谢阅读我的问题。

我正在尝试在用户单击索引为4的选项卡时实现弹出菜单。因此,我正在尝试阻止当按下索引4时,选项卡栏切换视图控制器。

这是我的代码:

- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if(viewController == [tabBarController.viewControllers objectAtIndex:4]){        
        NSLog(@"NO");
        return NO;
    }else{
        NSLog(@"YES");
        return YES;
    }

}

我已经实现了UITabBarControllerDelegateself.delegate = self;viewDidLoad中,并且它可以工作,但只有一次。

当我点击第4个选项卡时,菜单出现并且标签栏不会切换视图(太好了),但是当我再次点击它时,即使我得到“NO”日志,视图也会更改。这里可能有什么问题?

感谢您的任何建议!

已解决

由于下面Kasaname的答案,我通过添加selectedindex并将其设置为标志索引(prevtab)来解决它。我将prevtab更改为上次选择标签的索引,除非用户选择索引4。 我的最终代码:

- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if(viewController == [tabBarController.viewControllers objectAtIndex:4]){
        self.selectedIndex = prevTab; //only change in this method       
        return NO;
    }else{        
        return YES;
    }

}

为什么不在第四个选项卡中只使用空的ViewController? - NSDmitry
在您的视图控制器的viewDidAppear/viewWillAppear方法中添加断点。根据文档,无论所选的视图控制器是否更改,都会调用此方法。 - Abhishek Bedi
1
@ProFFeSSoR:在第四个选项卡中空白的ViewController是什么意思? - Abhishek Bedi
1
@PaperThick:为什么你在if条件语句中使用viewController而不是使用selectedIndex? - Abhishek Bedi
2个回答

17
这是如何防止标签栏项在单击标签栏项时切换选项卡的方法:
对于Swift 3.0版本,确保您已经实现了UITabBarControllerDelegate并将UITabbarController的delegate设置为self,然后在您的控制器中重写此委托。
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

    if viewController == tabBarController.viewControllers?[2] {
        return false
    } else {
        return true
    }
}

1
如果您确保实现了 UITabBarControllerDelegate 并将 UITabbarController 的代理设置为 self,那么它就能正常工作。 - Muhammad Adil
即使将delegate设置为self,它仍然无法工作。需要帮助吗? - Muhammad Umair Gillani
@MuhammadUmairGillani 你需要将它设置为 self.delegate = self。 - Anindya

5
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if (tabBarController.selectedIndex == 0) {

    } else if (tabBarController.selectedIndex == 1) {

    } else if (tabBarController.selectedIndex == 2) {

    }
}

为什么不使用这个委托? 我认为,使用这个委托会起作用。


如果再次点击,selectedIndex 怎么可能是0呢? - Abhishek Bedi
这里的selectedindex是指选项卡栏项目的索引,因此对于第一个选项卡它将始终为1。 - Kasaname
在上面的例子中,我只是举了一个例子,如何使用和选择索引取决于个人。 - Kasaname
谢谢,那应该可以正常工作。我已经在上面发布了我的最终代码。 - PaperThick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接