如何在 Swift 中的单独类中设置 UITextField 的委托?

Jas*_*nTW 4 delegates uitextfield uitextfielddelegate swift

我试图UITextFieldDelegate在单独的类中实现,但它不起作用:

class ViewController: UIViewController {

    @IBOutlet var TextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        let restrictor = TextFieldRestrictController()
        TextField.delegate = restrictor
    }
}

class TextFieldRestrictController : NSObject, UITextFieldDelegate {

    public func textField(_ textField: UITextField,
                          shouldChangeCharactersIn range: NSRange,
                          replacementString string: String) -> Bool {
        let inverseSet = NSCharacterSet(
            charactersIn:"0123456789.").inverted

        let components = string.components(separatedBy: inverseSet)

        let filtered = components.joined(separator:"")
        return string == filtered
    }
}
Run Code Online (Sandbox Code Playgroud)

但这正在起作用:

class ViewController: UIViewController {

    @IBOutlet var TextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        TextField.delegate = self
    }

    public func textField(_ textField: UITextField,
                          shouldChangeCharactersIn range: NSRange,
                          replacementString string: String) -> Bool {
        let inverseSet = NSCharacterSet(
            charactersIn:"0123456789.").inverted

        let components = string.components(separatedBy: inverseSet)

        let filtered = components.joined(separator:"")
        return string == filtered
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么不对?

ozg*_*gur 5

UITextField's.delegate 是一个viewDidLoad属性,因此在方法 结束时,restrictor将被释放,因为周围没有其他强引用指向它所指向的对象。

您可以尝试打印出来ValidationTextField.delegateviewDidAppear(animated:)看到它返回nil

为了解决这个问题,您可以定义restrictor一个实例变量,这样只要视图控制器处于活动状态,它就会保持活动状态:

class ViewController: UIViewController {
  @IBOutlet weak var ValidationTextField: UITextField!

  let restrictor = TextFieldRestrictController()

  override func viewDidLoad() {
    super.viewDidLoad()
    ValidationTextField.delegate = restrictor
  }
}
Run Code Online (Sandbox Code Playgroud)