为什么我的 IBAction 函数需要一个参数?

Why does my IBAction function need a parameter?

在下面的代码中,如果 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()
    }

}

这与参数的存在与否无关(不过,我应该补充一点,拥有参数是一种很好的做法,您应该坚持使用它,即使您只有一个文本字段)。

这是真正发生的事情。从这个屏幕截图中可以看出,一个文本字段针对许多不同的控制事件发出操作消息:

您要连接到 fahrenheitFieldEditingChanged 的是 "Editing Changed"。这是每次用户更改文本时触发的那个。如果连接不同的控制事件,那个控制事件将调用fahrenheitFieldEditingChanged,这不是你想要的。

同样,如果您通过将控件拖动到代码来创建动作连接,对话框会提示为错误的动作创建连接:

如果您在点击“连接”之前不将“Editing Did End End”更改为“Editing Changed”,接下来就会发生不好的事情。

不幸的是,当您连接到 现有 操作方法时,对话框甚至不会出现!您刚刚获得了 Editing Did End 操作的连接。这就是您断开连接并重新连接时发生的情况。

寓意:使用连接检查器(我的第一个屏幕截图),这样您就可以首先从正确的控制事件中拖动