【发布时间】:2017-01-25 10:07:39
【问题描述】:
这里有一个我非常喜欢的图书馆 (https://github.com/pixyzehn/MediumMenu)。
基本上它做了以下事情:
后面的菜单其实是一个UIViewController。如果我们深入研究源代码,我们会发现以下非常重要的代码:
public init(items: [MediumMenuItem], forViewController: UIViewController) {
self.init()
self.items = items
height = screenHeight - 80 // auto-calculate initial height based on screen size
frame = CGRect(x: 0, y: 0, width: screenWidth, height: height)
contentController = forViewController
menuContentTableView = UITableView(frame: frame)
menuContentTableView?.delegate = self
menuContentTableView?.dataSource = self
menuContentTableView?.showsVerticalScrollIndicator = false
menuContentTableView?.separatorColor = UIColor.clearColor()
menuContentTableView?.backgroundColor = menuBackgroundColor
addSubview(menuContentTableView!)
if panGestureEnable {
let pan = UIPanGestureRecognizer(target: self, action: #selector(MediumMenu.didPan(_:)))
contentController?.view.addGestureRecognizer(pan)
}
let menuController = UIViewController()
menuController.view = self
UIApplication.sharedApplication().delegate?.window??.rootViewController = contentController
UIApplication.sharedApplication().delegate?.window??.insertSubview(menuController.view, atIndex: 0)
}
前几行并不重要,但最后几行(处理UIApplication.sharedApplication().delegate?.window?? 的行是这个库工作的关键,但它们也限制了库。
根据这些行,我们将 UIViewController 设置为我们希望菜单的 rootViewController,然后我们将菜单视图添加到窗口的 0 索引处(我猜这就是放置它的原因在后面,在contentController 后面)。
库的问题:
仅当您希望初始视图控制器上的菜单时,该库才有效。从某种意义上说,只有当 contentController 已经是 rootViewController 时。它实际上会在我的应用程序中为我工作,但我无法继续使用我原来的 UIViewController,因为它不再在层次结构中。
我有一个场景,我有一个登录视图控制器,当你成功登录时,我将你转到我想要菜单的 UINavigationController。问题的第一个明显迹象是我收到投诉 “警告:尝试在其视图不在窗口层次结构中的 LoginViewController 上呈现 UINavigationController!” 显然,它不在窗口层次结构中,因为我正在重新分配 rootViewController。
我不知道如何解决这个问题。当我想要菜单的 UIViewController 不是初始视图控制器时,有没有办法让这个功能起作用?
【问题讨论】:
-
你的初始
UIViewController是UINavigationController吗?
标签: ios uiviewcontroller appdelegate uiwindow rootviewcontroller