【问题标题】:UIView not triggering action in corresponding controllerUIView 未触发相应控制器中的操作
【发布时间】:2020-06-07 10:26:59
【问题描述】:

我有一个显示 LoginView 的 LoginController。当用户输入电子邮件和密码时,应该会出现一个名为 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)
    }
}

登录视图

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")
    }
}

【问题讨论】:

    标签: swift firebase model-view-controller view uiview


    【解决方案1】:

    你需要设置loginViewloginController

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

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

    【讨论】:

      【解决方案2】:

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

      • var loginController: LoginController?
      • 致:
      • weak var loginController: LoginController?

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

      【讨论】:

        猜你喜欢
        • 2016-10-11
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多