Селектор кнопки закрытия не сработает без глобальной переменной - PullRequest
0 голосов
/ 05 марта 2019

Мой корневой 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()
...