UITextFieldDelegate 的 textField 方法没有被调用

Posted

技术标签:

【中文标题】UITextFieldDelegate 的 textField 方法没有被调用【英文标题】:textField method of UITextFieldDelegate not being called 【发布时间】:2016-09-23 11:54:25 【问题描述】:

我想我可能在做一些愚蠢的事情,但我还是要问这个问题。 我看不到 UITextFieldDelegate 方法 textField 被调用。我创建了一个带有打印语句的简单程序,显示所有其他委托方法都可以正常调用,但不是这个。这是程序代码:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate 

    //MARK: Properties
    @IBOutlet weak var testTextField: UITextField!

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        testTextField.delegate = self
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    //MARK: UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -> Bool 
        print("textFieldShouldReturn")
        textField.resignFirstResponder()
        return true
    

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool 
        print("textFieldShouldBeginEditing")
        return true
    

   func textFieldDidBeginEditing(textField: UITextField) 
        print("textFieldDidBeginEditing")
        print("Leaving textFieldDidBeginEditing")
    

    func textField(textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
        print("textField")
        print("Leaving textField")
        return true
    

   func textFieldDidEndEditing(textField: UITextField) 
        print("textFieldDidEndEditing")
        print("textField = \(textField.text)")
        print("Leaving textFieldDidEndEditing")        
    

就是这样。我在 Interface Builder 中添加了一个带有 UITextField 的 ViewController。输入文本显示正在调用其他委托方法。我正在使用 Xcode 7.3.1。 如果这是一个愚蠢的问题,任何帮助都非常感谢和道歉 - 我希望它是。

【问题讨论】:

你把 UITextField 和 IBOutlet 连接起来了吗? 是的。我在IB中建立了联系。我看到所有其他委托函数都被调用 - 我想如果我没有建立连接,我就不会看到那些? 尝试将 textField 出口标记为强而不是弱(只需删除弱关键字),引用可能会被破坏,因此永远不会调用委托。远射,但值得一试。 刚才试过了。恐怕没有变化。但我很感激现在的任何远射...... 【参考方案1】:

我认为由于函数中的拼写错误,您正面临这个问题。

这是你正在使用的:

func textField(textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool ...

函数应该是这样的:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool ...

【讨论】:

好的,非常感谢,现在可以使用了!我说我可能在问一个愚蠢的问题。我从 API 参考页面link 正确复制了函数签名。 Objective-C 声明正确为shouldChangeCharactersInRange 使用 Swift 5(根据 this 也使用 Swift 3 和 4)你必须使用 shouldChangeCharactersIn【参考方案2】:

只需将此行复制并粘贴到您的 ViewDidLoad 中,然后尝试使用此文本字段

let txtField: UITextField = UITextField(frame: CGRect(x: 0, y: 0, width: 400.00, height: 30.00));
    txtField.delegate = self

【讨论】:

没有变化。我今天早上开始以编程方式创建一个文本字段,当我看到 textField 方法没有被调用时,我创建了上面的测试程序,并通过 IB 创建了文本字段以尽可能多地去除不必要的代码。只是又试了一次,还是没有变化。

以上是关于UITextFieldDelegate 的 textField 方法没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

UITextFieldDelegate 崩溃 (exc_bad_access)

ViewController 实现 UITextFieldDelegate 时出错

实现 UITextFieldDelegate

swift UITextFieldDelegate 扩展

UITextFieldDelegate 的 textField 方法没有被调用

UITextFieldDelegate协议