UIView 未触发相应控制器中的操作

UIView not triggering action in corresponding controller

我有一个显示登录视图的登录控制器。当用户输入电子邮件和密码时,应该会出现一个名为 class CockpitController 的 cockpitController 的新 ViewController。我不使用故事板。 问题:当我点击登录按钮时,loginController 似乎没有收到操作。 @objc func loginButtonClicked() 应该在 loginController 中调用 func login。我在这里缺少什么。

登录控制器

import UIKit
import Firebase

class LoginController: UIViewController {

    var loginView: LoginView { return self.view as! LoginView }

    var homeController: HomeController?

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func loadView() {

        self.view = LoginView(frame: UIScreen.main.bounds)

        loginView.setupViews()
    }

    var cockpitController: CockpitController?

    func login(email: String, password: String) {

        Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
           guard error == nil else {
            //   ...
              return
            }

            self.present(self.cockpitController!, animated: true, completion: nil)
        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
}

LoginView

import UIKit

class LoginView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.red

        setupViews()
    }

    var loginController: LoginController?

    let userEmailTextField: UITextField = {
        let textField = UITextField()
        textField.backgroundColor = UIColor.white
        textField.borderStyle = .roundedRect
        return textField
    }()

    let passwordTextField: UITextField = {
        let textField = UITextField()
        textField.backgroundColor = UIColor.white
        textField.borderStyle = .roundedRect
        return textField
    }()

    let loginButton: UIButton = {
        let button = UIButton()
        button.setTitle("Login", for: .normal)
        button.setTitleColor(UIColor.white, for: .normal)
        button.setTitleColor(UIColor.black, for: .highlighted)
        button.backgroundColor = UIColor.red
        button.addTarget(self, action:#selector(loginButtonClicked), for: .touchUpInside)
        return button
    }()

    let signUpButton: UIButton = {
        let button = UIButton()
        button.setTitleColor(UIColor.black, for: .normal)
        button.setTitle("Creat a Account", for: .normal)

        return button
    }()

    @objc func loginButtonClicked() {

        let email = userEmailTextField.text
        let password = passwordTextField.text

        self.loginController?.login(email: email!, password: password!)

    }

    func setupViews() {

        //... addSubviews
        //... constraints
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

您需要设置 loginViewloginController

override func loadView() {

    self.view = LoginView(frame: UIScreen.main.bounds)
    loginView.loginController = self
    loginView.setupViews()
}

提示:另外,将 loginView 中的 loginController 修改为 weak var 以避免引用循环。

我还有一个提议! 您需要更改此行:

  • var loginController: LoginController?
  • 为此:
  • weak var loginController: LoginController?

这将帮助您避免强引用和内存泄漏。