如何在 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 中设置协议函数不能正确调用

如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据

Swift:在 UIButton 类中设置宽度和高度

在 Swift 2 中设置多个类属性时的防护

在 Swift 的 Objective-C++ 类中设置变量 --> 意外的 nil 崩溃