在Swift中将UITextField转换为字符串

5
我将尝试将UITextField对象转换为字符串,以便将其传递到模型文件中的函数。但即使我在名称输入文本字段中键入字符然后单击外部,它仍然打印为空白。为什么那里没有存储任何内容?
在视图控制器文件中:
@IBOutlet weak var nameInputText: UITextField!

  override func viewDidLoad() {


    super.viewDidLoad()
    nameInputText.delegate = self
    let text: String = nameInputText.text!
    print(text) //this prints a blank
    model.validateName(nametext: text)

}

你在 viewDidLoad 中有这段代码,你确定 nameInputText 中有任何文本吗? - Rashwan L
这段代码会在控制器加载时执行。你先在文本框中输入了文本吗? - kailoon
我应该把这个放在哪里,以便文本被加载到变量中?是的,我在文本字段中输入了一些字符。 - Kevin
@jean 你应该在 textFieldDidEndEditing 中完成它,可以看看我的回答。 - Dávid Pásztor
我正在创建一个UITextFields数组。我应该在viewDidLoad函数中还是其他地方创建它? - Kevin
2个回答

4
应该像下面这样。
    @IBOutlet weak var usernameInputText : UITextField!

      override func viewDidLoad() {

        super.viewDidLoad()
        usernameInputText.delegate = self
    }

    func ClickOnButton()
    {
      let text: String = usernameInputText.text!
        print(text) //this prints My text
        model.validateName(nametext: text)
    }

func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String)
        -> Bool
    {
       let text: String = usernameInputText.text!
        print(text) //this prints My text
        model.validateName(nametext: text)
    }

UITextField的文本设置为程序化,然后在不从UI更改其文本的情况下将该文本发送到不同的函数而不是发送字符串本身,这有什么意义呢? - Dávid Pásztor
尝试获取用户输入的文本。 - Kevin
我已经编辑了答案... 你可以在每个文本输入上调用方法,或者你可以显示一个按钮,在点击该按钮时调用方法。 - Vibha Singh
@VibhaSingh,在textField(_ textField:UITextField,shouldChangeCharactersIn range:NSRange,replacementString string:String)中不应读取文本字段的值,如果您想获取文本字段的最终值,可以在textFieldDidEndEditing中进行。此外,您的函数不正确,它没有返回任何值,而需要返回一个Bool值。 - Dávid Pásztor
这不会存储用户输入的最后一个字母。 - Kevin

1

viewDidLoad会在ViewController对用户可见之前被调用,所以如果你想让文本框中包含文本,你需要在InterfaceBuilder或代码中设置文本。如果你想要获取用户在文本框中输入的内容,你应该在textFieldDidEndEditing或者其他只有在用户交互发生后才会被调用的函数中实现。

@IBOutlet weak var nameInputText: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    nameInputText.delegate = self
}

extension ViewController: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        model.validateName(nametext: textField.text)
    }
}

我应该在textFieldDidEndEditing函数中添加let text: String = usernameInputText.text!吗? - Kevin
我尝试了这个扩展函数,但它无法编译。超出范围。 - Kevin
编译器可能无法正确处理您的model.validateName函数,您在哪里定义它了?不要强制解包textField的文本,但是如果您需要将文本存储以供以后使用而不仅仅是调用验证函数,则可以将其存储在变量中。 - Dávid Pásztor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接