在下面的代码中,如果fahrenheitFieldEditingChanged()具有参数
,则会按预期调用textField: UITextField
如果我从函数中删除参数,它似乎没有被调用,即使我从旧函数原型中删除了连接并为新函数原型重新创建它。我知道它没有被调用,因为我在函数的开头添加了这一行,无论我做什么都不会发生变化:
celsiusLabel.text = "?????"
请帮帮忙?这是我的代码。 (为什么我关心这个参数?我希望我能引用我的IBOutlet textField,它应该与传递给编辑更改函数的对象相同,因为我的故事板只有一个UITextField。)
import Foundation
import UIKit
class ConversionViewController: UIViewController {
@IBOutlet var celsiusLabel: UILabel!
@IBOutlet var textField: UITextField!
var fahrenheitValue: Double? {
didSet {
updateCelsiusLabel()
}
}
var celsiusValue: Double? {
if let value = fahrenheitValue {
return (value - 32) * 5/9
}
else {
return nil
}
}
func updateCelsiusLabel() {
if let value = celsiusValue {
celsiusLabel.text = "\(value)"
}
else {
celsiusLabel.text = "???"
}
}
@IBAction func fahrenheitFieldEditingChanged() {
if let text = textField.text {
if let value = Double(text) {
fahrenheitValue = value
}
else {
fahrenheitValue = nil
}
}
}
@IBAction func dismissKeyboard(sender: AnyObject) {
textField.resignFirstResponder()
}
}
答案 0 :(得分:2)
这与参数的存在与否无关(但是,我应该补充一点,参数是非常好的练习,你应该坚持下去,即使你只有一个文本字段)。
这是真正发生的事情。正如您在此屏幕截图中看到的,文本字段会在许多不同的控制事件上发出操作消息:
您想要连接到fahrenheitFieldEditingChanged
的是“编辑已更改”。这是用户每次更改文本时触发的那个。如果您连接其他控制事件,则会为 控制事件调用fahrenheitFieldEditingChanged
,这将不是您想要的。
同样,如果通过控制拖动到代码来创建操作连接,则对话框提供为错误操作创建连接 :
如果在点击“连接”之前没有更改“编辑已结束至编辑已更改”,那么将会发生不好的事情。
不幸的是,当您连接到现有的操作方法时,甚至不会出现对话框!您只需获得Editing Did End操作的连接即可。这就是断开连接并重新连接时发生的事情。
道德:使用Connections检查器(我的第一个屏幕截图),这样你就可以从正确的控制事件中拖出。