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")
}
}
您需要设置 loginView
的 loginController
。
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?
这将帮助您避免强引用和内存泄漏。
我有一个显示登录视图的登录控制器。当用户输入电子邮件和密码时,应该会出现一个名为 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")
}
}
您需要设置 loginView
的 loginController
。
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?
这将帮助您避免强引用和内存泄漏。