为什么我的IBAction功能需要参数?

时间:2016-03-03 02:08:24

标签: xcode swift ibaction

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

}

1 个答案:

答案 0 :(得分:2)

这与参数的存在与否无关(但是,我应该补充一点,参数是非常好的练习,你应该坚持下去,即使你只有一个文本字段)。

这是真正发生的事情。正如您在此屏幕截图中看到的,文本字段会在许多不同的控制事件上发出操作消息:

enter image description here

您想要连接到fahrenheitFieldEditingChanged的是“编辑已更改”。这是用户每次更改文本时触发的那个。如果您连接其他控制事件,则会为 控制事件调用fahrenheitFieldEditingChanged,这将不是您想要的。

同样,如果通过控制拖动到代码来创建操作连接,则对话框提供为错误操作创建连接

enter image description here

如果在点击“连接”之前没有更改“编辑已结束至编辑已更改”,那么将会发生不好的事情。

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

道德:使用Connections检查器(我的第一个屏幕截图),这样你就可以从正确的控制事件中拖出