我在ios应用程序中创建了一个hamburger menu
。
我的navigationBar
中有一个rootViewController
,但现在我需要将navigationBar
移到我的childViewController
中的一个才能使一些functions/buttons
工作。
现在我已经把它移到一个childViewController
中,navigationBar
不会显示。如果我使childViewController
的rootController
显示良好,这是因为在我的navigationBar
中,我有appDelegate
作为rootController
。
只有当我将其设为navigationController
时,childViewController
才决定不显示。不知道我需要做什么才能让它起作用。
这是我的navigationBar
,我在这里制作appDelegate
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
window?.rootViewController = UINavigationController(rootViewController: jobListController())
return true
}
这是我的汉堡包菜单,我在这里添加了:
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
}
这是我要将
rootViewController
添加到的viewDidLoad
:class jobListController: UIViewController {
super.viewDidLoad()
navigationController?.navigationBar.barTintColor = UIColor(red:1.00, green:1.00, blue:1.00, alpha:1.0)
navigationController?.view.backgroundColor = UIColor(red:1.00, green:1.00, blue:1.00, alpha:1.0)
navigationController?.navigationBar.shadowImage = UIImage()
navigationItem.title = "JOBS"
let searchButton = UIBarButtonItem(barButtonSystemItem: .search, target: self, action: #selector(HandleSearch))
let addNewJobButton = UIBarButtonItem(barButtonSystemItem: .compose, target: self, action: #selector(HandleNewJob))
searchButton.tintColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
addNewJobButton.tintColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
navigationItem.rightBarButtonItems = [addNewJobButton, searchButton]
}
}
编辑:
在使用了卢卡斯·马雷达的答案之后,这个答案似乎解决了我遇到的问题,它创造了一个新的问题。
在我的rootController(汉堡包菜单)上,我可以在屏幕上的任何地方滑动,它将打开汉堡包菜单,这是很好的,因为这是期望的效果。
我的一个孩子的视图控制器在我的汉堡菜单里面有一个表视图。如果我单击其中一个单元格并转到一个新的viewController,汉堡包菜单仍然可以通过向右滑动来访问。
我只想在顶层访问汉堡包菜单,但现在似乎我可以在我的应用程序中的任何地方访问它。
最佳答案
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控制器应将NavigationController(或其子类)嵌入某些根视图控制器。所以在汉堡控制中心
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)工作清单可以保持不变。我假设在当前状态下,
navigationController
属性为零更新的答案
关于如何处理
hamburgerGestureRecognizer
1)您可以将HamburgerEstureRecognizer添加到
rootViewController
视图中在您的情况下,它是
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
在汉堡菜单的屏幕之间切换的地方,你可以重用这个识别器
viewControllerToPresent.view.addGestureRecognizer(hamburgerGestureRecognizer)
2)您可以实现手势识别器的委托功能,并根据presenting viewController有条件地禁用它。像这样的:
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return currentlyPresentedNavigationController.viewControllers.count == 1
}
关于ios - 导航栏未显示在childViewController内部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49918414/