在自定义 UiView 中的何处设置 UiTextField 委托方法

Where to set UiTextField delegate method in custom UiView

设置 UITextField 委托时发生错误。

我的代码是:

import UIKit

class UserAlertVC: UIView , UITextFieldDelegate {
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
    // Drawing code
}
*/

override init(frame: CGRect) {
    super.init(frame: frame)

}

required init(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)!
    self.addBehavior()

}


func addBehavior (){
    print("Add all the behavior here")
    userNameTxtField.delegate = self
    passwordTxtField.delegate = self

}


func textFieldShouldReturn(textField: UITextField) -> Bool {

    return true
}

func textFieldDidBeginEditing(textField: UITextField) {

}


@available(tvOS 10.0, *)
func textFieldDidEndEditing(textField: UITextField, reason: UITextFieldDidEndEditingReason) {

}

@IBAction func actionOnCancel(sender: UIButton) {
    self .removeFromSuperview()


}


@IBAction func actionOnProceed(sender: UIButton) {
    self .removeFromSuperview()
UserAlertVC.showAlertForUser()


}

@IBOutlet var userNameTxtField: UITextField!

@IBOutlet var passwordTxtField: UITextField!

static func showAlertForUser() {

    let alert       = NSBundle.mainBundle().loadNibNamed("KeyboardViewController", owner: self, options: nil)!.last as! UIView
    let windows     = UIApplication.sharedApplication().windows
    let lastWindow  = windows.last
    alert.frame     = UIScreen.mainScreen().bounds
    lastWindow?.addSubview(alert)


}
}

错误信息是:

fatal error: unexpectedly found nil while unwrapping an Optional value

我使用自定义警报视图 XIB.pls 建议任何解决方案。

首先看一下视图的生命周期。根据这一点,可以强调方法 awakeFromNib 非常合适,因为:

The nib-loading infrastructure sends an awakeFromNib message to each object recreated from a nib archive, but only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet and action connections already established.

确保为.Xib 内容视图添加一个@IBOutlet,您还需要添加Nib 代码。最后,确保在 ViewController 中将 UIView Outlet 设置为 UserAlertVC 并添加 awakeFromNib 方法。请找到附件中的代码。如果您需要进一步的帮助,请告诉我。

这是与.xib文件相关的代码。

import UIKit

class UserAlertVC: UIView, UITextFieldDelegate {

//MARK: - Outlets

@IBOutlet var contentView: UIView!
@IBOutlet var userNameTxtField: UITextField!
@IBOutlet var passwordTxtField: UITextField!

//MARK: - Loads

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    commonInit()
}

//MARK: - Functions

func commonInit() {
    Bundle.main.loadNibNamed("UserAlertVC", owner: self, options: nil)
    userNameTxtField.delegate = self
    passwordTxtField.delegate = self

    contentView.translatesAutoresizingMaskIntoConstraints = false

    addSubview(contentView)

    // add constraints programmatically
}

// add the rest of your code

}

这是与ViewController相关的代码。

class ViewController: UIViewController {

//MARK: - Outlets

@IBOutlet weak var userAlertVC: UserAlertVC!

//MARK: - Loads

override func viewDidLoad() {
    super.viewDidLoad()
}

override func awakeFromNib() {
    super.awakeFromNib()
}

}