Мой корневой viewController содержит переменную для другого класса и кнопку для отображения представления этого класса:
class ViewController: UIViewController {
var myBoxView = BoxView()
override func viewDidLoad() {
let btn = UIButton()
btn.backgroundColor = UIColor.green
btn.addTarget(self, action: #selector(showBoxView), for: .touchUpInside)
view.addSubview(btn)
btn.translatesAutoresizingMaskIntoConstraints = false
view.addConstraint(NSLayoutConstraint(item: btn, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: btn, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1.5, constant: 0))
}
}
extension ViewController {
@objc func showBoxView(_ sender: UITapGestureRecognizer?) {
// let myBoxView = BoxView()
myBoxView.showView()
}
}
Другой класс соответствует NSObject и имеет другую кнопку, чтобы закрыть его представление:
class BoxView: NSObject {
let boxView = UIView(frame: CGRect(x: 50, y: 200, width: 300, height: 300))
let closeBtn = UIButton()
func showView() {
if let window = UIApplication.shared.keyWindow {
closeBtn.addTarget(self, action: #selector(closeBoxView), for: .touchUpInside)
closeBtn.backgroundColor = UIColor.blue
closeBtn.translatesAutoresizingMaskIntoConstraints = false
boxView.addSubview(closeBtn)
boxView.addConstraint(NSLayoutConstraint(item: boxView, attribute: .centerX, relatedBy: .equal, toItem: closeBtn, attribute: .centerX, multiplier: 1, constant: 0))
boxView.addConstraint(NSLayoutConstraint(item: boxView, attribute: .centerY, relatedBy: .equal, toItem: closeBtn, attribute: .centerY, multiplier: 1, constant: 0))
boxView.backgroundColor = UIColor.red
window.addSubview(boxView)
boxView.alpha = 1
}
}
}
extension BoxView {
@objc func closeBoxView(_ sender: UITapGestureRecognizer) {
UIView.animate(withDuration: 0.3) {
self.boxView.alpha = 0
self.boxView.removeFromSuperview()
}
}
}
Код был упрощен.
Это все отлично работает до ...
(То есть. Когда кто-то нажимает на корневую кнопку, запускается селектор (showBoxView), и отображается BoxView. Затем нажимается кнопка закрытия (срабатывает closeBoxView), и он исчезает. Затем возобновляется нормальная работа.)
Когда я не использую глобальную переменную (myBoxView) и не создаю новый экземпляр, селектор кнопки закрытия класса (closeBoxView) не срабатывает. Даже если boxView отображается.
(IE. Я вставляю let myBoxView = BoxView()
в начало метода "showBoxView")
Почему не вызывается селектор (closeBoxView) без использования его экземпляра (из корневого VC)?
PS. Я сделал это программно, добавив в AppDelegate "didFinishLaunchingWithOptions":
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
window?.rootViewController = ViewController()