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

Posted

技术标签:

【中文标题】UIView 未触发相应控制器中的操作【英文标题】:UIView not triggering action in corresponding controller 【发布时间】: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")
    

【问题讨论】:

【参考方案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?

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

【讨论】:

以上是关于UIView 未触发相应控制器中的操作的主要内容,如果未能解决你的问题,请参考以下文章

披露指示器未触发辅助动作序列

来自superview的UIView(Container View)内的触发方法

从 iOS 中的 UIView 子视图重新加载时 UITableView 未重新加载

从笔尖加载的 UIView 未显示多个 UILabel

CodeIgniter 控制器功能未触发

自定义 UIView 标签和动画未显示在视图控制器中