隐藏 UITabBarController 的 tabBarItem,同时仍然能够显示关联的视图

Hiding UITabBarController's tabBarItem while being able to show associated view nevertheless

我正在尝试为我的 iPhone "Tabbed App" 创建一个导航,其中包括(显然)UITabBarControllerSWRevealViewController 以显示侧边菜单。

我的应用程序中的所有视图 必须 同时显示 UITabBarControllerUINavigationBar,但是 link 出现在左侧-侧面菜单(由 SWRevealViewController 处理)不得 出现在 UITabBarController.

我的左侧菜单link是这样处理的:

import UIKit

class MenuTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.clearsSelectionOnViewWillAppear = false
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedIndex = (indexPath as NSIndexPath).row + 1  // hardcoded for time being
        let tabBarController = revealViewController().frontViewController as! UITabBarController

        let navController = tabBarController.viewControllers![selectedIndex] as! UINavigationController
        navController.popToRootViewController(animated: true)

        tabBarController.selectedIndex = selectedIndex
        revealViewController().pushFrontViewController(tabBarController, animated: false)
    }
}

现在,我尝试删除我不想在 UITabBarController 中显示的其中一个视图的 link,如下所示:

import UIKit

class TabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let index = 2  // hardcoded for time being
        viewControllers?.remove(at: index)
    }
}

但是如果我现在点击左侧菜单中的关联 link,我会得到一个 NSRangeException index 2 beyond bounds [0 .. 1] 错误(当然,因为我从 [=12= 中删除了特定的 tabBarItem ]).

我的问题是:如何 "hide" 来自 UITabBarController 的项目,但仍然能够从我的侧面菜单中引用它(并打开它)?

更新
我现在的故事板是这样的:

使用 "menu" 来操作选项卡可能不是一个好主意 - 这就是 Apple 设计更多...和编辑...功能的目的。

根据您的总体设计/导航/用户体验流程,两个合理的选择是:

  1. 不是替换当前选定的选项卡,而是 .present 模态视图控制器,使用 "Cancel" 或 "Save" 或 "Done" 按钮 .dismiss 它(任何合适的)。

  2. 由于您声明每个选项卡的 ViewController 是一个 NavigationController,因此您可以 .push 将菜单​​选择的视图控制器添加到当前堆栈中。然后您的界面可以使用标准的“<返回”按钮导航。

祝你好运:)