导航栏不显示在childViewController中

时间:2018-04-19 10:11:10

标签: ios swift xcode uinavigationcontroller

我在我的ios应用中创建了hamburger menu

我的navigationBar中有一个rootViewController,但现在我需要将navigationBar移到childViewController之一,以便某些functions/buttons能够正常工作

现在我已将其移至childViewControllernavigationBar无法显示。如果我childViewController rootController navigationBar显示正常,这是因为在我的appDelegaterootControllernavigationController

只有当我childViewController navigationBar决定不显示时才会这样做。不知道我需要做什么才能让它发挥作用。

以下是我appDelegate的{​​{1}}:

rootViewController

这是我的汉堡包菜单func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) window?.makeKeyAndVisible() window?.rootViewController = UINavigationController(rootViewController: jobListController()) return true } viewDidLoad,我在其中添加了(rootViewController)

childViewControllers

这是override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.white // ADD VIEWCONTROLLERS TO MENU view.addSubview(sideBarUIView) addChildViewController(sideBar) view.addSubview(sideBar.view) sideBar.view.center = sideBarUIView.center addChildViewController(jobList) view.addSubview(jobList.view) jobList.view.center = overlayView.center // ADD UI VIEWS TO HAMBURGER MENU view.addSubview(overlayView) overlayView.isHidden = true } ,我想将childViewController添加到:

navigationBar

修改

在使用了LukášMareda的答案之后,它似乎解决了我遇到的问题,它引发了一个新问题。

在我的rootController(汉堡菜单)上,我可以在屏幕上的任何位置滑动,它会打开汉堡菜单,这很棒,因为这是所需的效果。

我的hamburgerMenu中的一个子视图控制器有一个tableView。如果我点击其中一个单元格并转到一个新的viewController,仍然可以向右滑动访问汉堡包菜单。

我只想在顶层访问汉堡包菜单,但似乎我现在可以在我的应用程序的任何地方访问它。

2 个答案:

答案 0 :(得分:1)

1)汉堡菜单视图控制器应该是UIViewController的子类。 appDelegate的第一步:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = HamburgerViewController()
        window?.makeKeyAndVisible()

        return true
    }

2)HamburgerView控制器应该使用一些rootview控制器嵌入NavigationController(或其子类)。所以在HamburgerViewController中

override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.white

        // ADD VIEWCONTROLLERS TO MENU
        view.addSubview(sideBarUIView)

        addChildViewController(sideBar)
        view.addSubview(sideBar.view)
        sideBar.view.center = sideBarUIView.center

        let navigationController = UINavigationController(rootViewController: jobListController())
        addChildViewController(navigationController)
        view.addSubview(navigationController.view)
        navigationController.view.center = overlayView.center

        // ADD UI VIEWS TO HAMBURGER MENU
        view.addSubview(overlayView)
        overlayView.isHidden = true
    }

3)JobList可以留在它。我假设在当前状态下,navigationController属性为nil

更新回答

有两个关于处理hamburgerGestureRecognizer

的想法

1)您可以将hamburgerGestureRecognizer添加到rootViewController。view中 在你的情况下它是JobList所以手势识别器将只在rootViewController

            let jobList = jobListController()
            let navigationController = UINavigationController(rootViewController: jobList)
            addChildViewController(navigationController)
            view.addSubview(navigationController.view)
            joblist.view.addGestureRecognizer(hamburgerGestureRecognizer)
            navigationController.view.center = overlayView.center

在hamburgerMenu中切换屏幕的地方,您可以重复使用此识别器

viewControllerToPresent.view.addGestureRecognizer(hamburgerGestureRecognizer)

2)您可以实现手势识别器的委托功能,并根据呈现的viewController有条件地禁用它。像这样:

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return currentlyPresentedNavigationController.viewControllers.count == 1
    }

答案 1 :(得分:0)

你需要推VC。将root设置为hamburgerMenuVC,然后...... 在汉堡包菜单内做:

let jobListVC = self.navigationController?.childViewController[0] as! jobListController
self.navigationController?.pushViewController(jobListVC, animated: true)

或者:

let jobListVC = jobListController()
self.navigationController?.pushViewController(jobListVC, animated: true)

或者:

let vcs = [jobListController()]
self.navigationController?.setViewControllers(vcs, animated: true)

在jobListController中添加视图,而不是hamburgerMenuVC(创建CGRect等)。