【问题标题】:textField method of UITextFieldDelegate not being calledUITextFieldDelegate 的 textField 方法没有被调用
【发布时间】: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 出口标记为强而不是弱(只需删除弱关键字),引用可能会被破坏,因此永远不会调用委托。远射,但值得一试。
  • 刚才试过了。恐怕没有变化。但我很感激现在的任何远射......

标签: swift xcode


【解决方案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 创建了文本字段以尽可能多地去除不必要的代码。只是又试了一次,还是没有变化。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 2014-06-02
  • 2011-08-28
  • 2017-02-24
  • 2015-02-23
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多