我有一个带有按钮的视图控制器,该按钮具有以下操作。
@IBAction func sourceButton(_ sender: Any) {
let menu = sourceMenu()
menu.openMenu()
}
源菜单类是带有以下代码的NSObject类。
class sourceMenu: NSObject {
let blackView = UIView()
public func openMenu(){
if let window = UIApplication.shared.windows.filter({ $0.isKeyWindow }).first {
blackView.frame = window.frame
blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)
blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu)))
window.addSubview(blackView)
UIView.animate(withDuration: 0.5) {
self.blackView.alpha = 1
}
}
}
@objc public func dismissMenu(){
UIView.animate(withDuration: 0.5) {
self.blackView.alpha = 0
}
}
}
我在视图控制器上点击时未调用功能dismissMenu。有任何想法吗?谢谢。
问题实际上是因为对象仅存在于功能块中,所以您正在从内存中释放它。函数完成后,其执行内存将被清除。您需要在演示文稿UIViewController
中创建一个实例,以便系统通过视图控制器使它保持活动状态。您应该像这样声明一个属性。
class ViewController: UIViewController {
let menu = sourceMenu()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func tapAction(_ sender: Any) {
menu.openMenu()
}
}
此外,您只需执行UIApplication.shared.keyWindow
就可以获取对keyWindow的引用>
还有,为什么要在窗口上显示此内容而不使用视图控制器?如果这是每个控制器都应该能够显示的内容,为什么不进行扩展呢?我会避免从窗口显示视图,因为这可能会导致隐藏的问题。
我曾经遇到此问题。我为自己找到的解决方案对UITapGestureRecognizer
有很强的参考价值。因此,您应该做的是: