在Swift中,如何检测哪些UIControlEvents触发了该操作?

Chr*_*dez 3 events uitextfield ios swift

我目前有4个UITextField

@IBOutlet weak var fNameTextField: UITextField!
@IBOutlet weak var lNameTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var phoneTextField: UITextField!
Run Code Online (Sandbox Code Playgroud)

我想跟踪他们的各种事件:

[UIControlEvents.EditingChanged, UIControlEvents.EditingDidBegin, UIControlEvents.EditingDidEnd ]
Run Code Online (Sandbox Code Playgroud)

但是我不希望有3个事件单独的事件处理程序,所以我创建了一个这样的函数.这个函数很好地告诉我哪个UITextField触发了一个事件,但它没有告诉我哪个事件被触发:

fNameTextField.addTarget(self, action: "onChangeTextField:", forControlEvents: UIControlEvents.AllTouchEvents)
lNameTextField.addTarget(self, action: "onChangeTextField:", forControlEvents: UIControlEvents.AllTouchEvents)
emailTextField.addTarget(self, action: "onChangeTextField:", forControlEvents: UIControlEvents.AllTouchEvents)
phoneTextField.addTarget(self, action: "onChangeTextField:", forControlEvents: UIControlEvents.AllTouchEvents)

func onChangeTextField(sender:UITextField){
    switch(sender){
        case fNameTextField:
            print("First Name")
        case lNameTextField:
            print("Last Name")
        case emailTextField:
            print("E-mail")
        case phoneTextField:
            print("Phone")
        default: break
    }
}
Run Code Online (Sandbox Code Playgroud)

如何打印发件人姓名和触发事件的名称(例如:.EditingDidEnd,.EditingDidEnd,.EditingDidEnd)?

理想情况下,我不想编写多个事件处理程序,我更喜欢单个函数.

像这样的东西:

func onChangeTextField(sender:UITextField){
    switch(sender.eventTriggerd){
        case UIControlEvents.EditingChanged:
            println("EditingChanged")
        case UIControlEvents.EditingDidBegin:
            println("EditingDidBegin")
        case UIControlEvents.EditingDidEnd:
            println("EditingDidEnd")
        default: break
    }
}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 5

不幸的是,你无法区分触发动作处理程序的控件事件.这与Swift无关; 它只是Cocoa的一个特色.

这是一个奇怪的设计决定,但事实就是如此.例如,请参阅我的书,该书抱怨它:

奇怪的是,没有任何动作选择器参数提供任何方式来了解哪个控制事件触发了当前动作选择器调用!因此,例如,为了区分Touch Up Inside控制事件和Touch Up Outside控制事件,它们相应的目标 - 动作对必须指定两个不同的动作处理程序; 如果将它们分派给同一个动作处理程序,则该处理程序无法发现发生了哪个控制事件.