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)
有什么不对?
UITextField's.delegate 是一个弱viewDidLoad属性,因此在方法
结束时,restrictor将被释放,因为周围没有其他强引用指向它所指向的对象。
您可以尝试打印出来ValidationTextField.delegate并viewDidAppear(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)
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |