UIAlertController addTextFieldWithConfigurationHandler。奇怪的功能

UIAlertController addTextFieldWithConfigurationHandler. Odd functionality

我正在制作一个包含几个文本字段的警报,一旦点击保存,它就会保存在服务器上。我设法让它发挥作用,但发现了一些我不明白的奇怪之处。我不确定如何用文字解释它,所以我将 post 有问题的代码。

var enteredName: UITextField!

let myAlert: UIAlertController = UIAlertController(title: "", message: nil, preferredStyle: .Alert)
let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { action -> Void in
    println(self.enteredName.text)
}
myAlert.addAction(saveAction)
myAlert.addTextFieldWithConfigurationHandler { textField -> Void in
    textField.placeholder = "Name"
    self.enteredName = textField
}
self.presentViewController(myAlert, animated: true, completion: nil)

现在,上面的代码可以工作了,我也没有遇到任何问题,但是,我最初有一个非常相似的代码块,但没有工作。上面的代码片段将显示带有文本字段的警报,在输入内容并点击保存后,它将打印您输入的内容。下面的代码应该这样做但是打印了空白行,我假设是空字符串。

var enteredName: String!

let myAlert: UIAlertController = UIAlertController(title: "", message: nil, preferredStyle: .Alert)
let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { action -> Void in
    println(self.enteredName)
}
myAlert.addAction(saveAction)
myAlert.addTextFieldWithConfigurationHandler { textField -> Void in
    textField.placeholder = "Name"
    self.enteredName = textField.text
}
self.presentViewController(myAlert, animated: true, completion: nil)

如您所见,没有太大变化,对我来说,两个代码块看起来都应该 运行。差异:在不起作用的代码片段中

  1. 变量是字符串而不是 UITextField
  2. 变量被保存到 textField.text 而不是 textField
  3. 警报正在打印 self.enteredName 而不是 self.enteredName.text

所以我的问题是,为什么底部文本块不能正常工作,而顶部文本块可以正常工作?

addTextFieldConfigurationHandler 方法在用户有机会输入任何内容并按保存之前被调用(因此,在您放入 saveAction 的代码被执行之前)。

在底部示例中,您 曾经 唯一一次向 enteredName 字符串分配任何内容是在添加文本字段配置处理程序时。在用户看到文本字段后的任何时候都不会调用文本字段配置处理程序(因此永远不会在用户有机会在文本字段中键入之后)。

而且字符串变量不能神奇地从文本字段中获取值。