如何在 Swift 的单独类中设置 UITextField 的委托?
Posted
技术标签:
【中文标题】如何在 Swift 的单独类中设置 UITextField 的委托?【英文标题】:How to set delegate of UITextField in separate class in Swift? 【发布时间】:2017-05-17 08:57:43 【问题描述】:我正在尝试在单独的类中实现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
但这是有效的:
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
有什么问题吗?
【问题讨论】:
这是什么ValidationTextField? 只是我的错字,我已编辑。 :) 您是否还需要在类声明中声明协议UITextFieldDelegate
以便您的工作选项被接受为委托,即:class ViewController: UIViewController, UITextFieldDelegate
....? @JasonTW
【参考方案1】:
UITextField
的.delegate
是一个弱 属性,所以在viewDidLoad
方法的末尾,
restrictor
将被释放,因为周围没有其他强引用指向它所指向的对象。
您可以尝试在viewDidAppear(animated:)
中打印出ValidationTextField.delegate
并查看它是否返回nil
。
要解决这个问题,您可以将restrictor
定义为实例变量,这样只要视图控制器处于活动状态,它就会保持活动状态:
class ViewController: UIViewController
@IBOutlet weak var ValidationTextField: UITextField!
let restrictor = TextFieldRestrictController()
override func viewDidLoad()
super.viewDidLoad()
ValidationTextField.delegate = restrictor
【讨论】:
以上是关于如何在 Swift 的单独类中设置 UITextField 的委托?的主要内容,如果未能解决你的问题,请参考以下文章
在单独的文件中设置 UITableView 数据源和委托 - swift
如何在 DataProvider 类 Alamofire 函数 swift 中设置协议函数不能正确调用