有一个我非常喜欢的图书馆,你可以在这里找到(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 不是初始视图控制器时,有没有办法让这个功能工作?