我在我的ios应用中创建了hamburger menu
。
我的navigationBar
中有一个rootViewController
,但现在我需要将navigationBar
移到childViewController
之一,以便某些functions/buttons
能够正常工作
现在我已将其移至childViewController
,navigationBar
无法显示。如果我childViewController
rootController
navigationBar
显示正常,这是因为在我的appDelegate
我rootController
为navigationController
。
只有当我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,仍然可以向右滑动访问汉堡包菜单。
我只想在顶层访问汉堡包菜单,但似乎我现在可以在我的应用程序的任何地方访问它。
答案 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等)。