正在显示但未删除的覆盖视图



我有一个BaseViewController和一个使用MenuViewController的SideMenu。有许多可能的"主"屏幕都继承自同一个BaseViewController。MenuViewController也继承自BaseViewController。

我希望覆盖显示在主屏幕上,然后在菜单不再聚焦时消失到目前为止,我只能得到叠加显示,但不能消失

如果我点击其中一个菜单项,覆盖将消失,该菜单项将执行到BaseViewController的适当子类(例如,主屏幕或设置屏幕(的分段。这有效地刷新了屏幕,我想如果找不到更好的解决方案,我可以保留对调用方的引用并返回到它。

我尝试过的东西:

  • overlay.removeFromSuperview()
  • view.sendSubview(toBack: overlay)
  • overlay.isHidden = true
  • overlay.alpha = 0.0
  • 正在将hideOverlay()移动到MenuViewController中
  • 在MenuViewController中使用super.overlay,而不是简单地使用overlayself.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()
}
}

viewWillDisappear中,当您调用self.hideOverlay时,就是在您的MenuViewController上调用它。

调用showMenu()时,显示MenuViewController,然后在显示视图控制器上设置覆盖背景颜色。

我想,你想在这里做的是在完成MenuViewController,解雇方法做:

if let presentingViewController = self.presentingViewController as? BaseViewController {
presentingViewController.hideOverlay()
}

希望这有道理?

最新更新