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】:你需要设置loginView
的loginController
。
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)内的触发方法