我有一个BaseViewController和一个使用我的MenuViewController的SideMenu。有许多可能的“主页”屏幕都从同一BaseViewController继承。 MenuViewController也继承自BaseViewController。
我希望在主屏幕上显示一个叠加层,然后在菜单不再清晰时消失。 到目前为止,我只能显示叠加层,而不能消失。
如果我点击菜单项之一,则叠加层消失,这将对BaseViewController的适当子类(例如,“主屏幕”或“设置”屏幕)进行选择。这样可以有效地刷新屏幕,并且我认为如果找不到更好的解决方案,我可以保留对调用方的引用并重新选择它。
我尝试过的事情:
overlay.removeFromSuperview()
view.sendSubview(toBack: overlay)
overlay.isHidden = true
overlay.alpha = 0.0
hideOverlay()
移动到MenuViewController中。super.overlay
,而不是简单地overlay
或self.overlay
。我可以确认所有代码行都被断点击中,但是覆盖视图不会消失。当我点击以使菜单消失时,不会调用BaseViewController的viewWillAppear(),因为它的子类已经在视图中了(只是向侧面推了一点)。
这是一个最小的可重现示例:
基本视图控制器
import UIKit
import SideMenu
class BaseViewController: UIViewController {
let overlay = UIView()
override func viewDidLoad() {
super.viewDidLoad()
// Setup
overlay.frame = self.view.frame
overlay.backgroundColor = UIColor.clear
overlay.alpha = 0.5
overlay.isUserInteractionEnabled = false
overlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(overlay)
}
// WORKS
func showMenu() {
// menuLeftNavigationController is MenuViewController.
self.present(SideMenuManager.menuLeftNavigationController!, animated: true) {
UIView.animate(withDuration: 0.2) {
self.overlay.backgroundColor = Constants.Colors.overlayColor // Already defined.
}
// PROBLEM IS HERE
func hideOverlay() {
UIView.animate(withDuration: 0.2) {
self.overlay.backgroundColor = UIColor.clear
self.overlay.setNeedsLayout()
self.overlay.layoutIfNeeded()
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}
}
}
菜单视图控制器
import UIKit
import SideMenu
class MenuViewController: BaseViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Tableview boilerplate
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
// BREAKPOINTS CONFIRM THIS CODE EXECUTES.
override func viewWillDisappear(_ animated: Bool) {
self.hideOverlay()
}
}
答案 0 :(得分:0)
在viewWillDisappear
中,当您致电self.hideOverlay
时,就是在MenuViewController
上致电。
调用showMenu()
时,先显示MenuViewController
,然后在 presenting 视图控制器上设置覆盖背景色。
我想,您想在这里完成MenuViewController
,dismiss方法do:
if let presentingViewController = self.presentingViewController as? BaseViewController {
presentingViewController.hideOverlay()
}
希望这有意义吗?