0

我有一个视图,上面有多个动态创建的 UITextfields 和 UISegmented 控件(但就这个问题而言,也可能有 UIButtons、UISwitches、UISliders 或任何其他从 UIControl 继承的东西)。每当用户完成与任何控件的交互时,我都想执行一个动作,而不管它属于哪个控件子类。通过查看其他问题,我想我想在addTarget:action:forControlEvents:创建每个控件后使用它们来添加观察者,但我不知道我在寻找哪个事件。我已经尝试了此处 Apple Docs中列出的所有似乎相关的内容,但似乎没有一个每次都被触发。我正在寻找类似.LostFocusVBA 的东西,但我似乎无法找出那是什么 - 我知道有一个becomeFirstResponder使控件处于活动状态的方法,但我找不到像“lostFirstResponder”事件这样的东西。

我想我可以用isKindOfClass它来判断它是什么类型的控件,并相应地设置我的事件,但这似乎有点草率,我觉得应该有更直接的方法来做到这一点。我也可以设置一个 UITapGestureRecognizer 并以这种方式构建一些东西,但这仍然感觉像是一种解决方法,而不是它应该完成的方式。

4

1 回答 1

2

如果您愿意子类化,您可以覆盖-resignFirstResponder以检测丢失的“焦点”,并采取相应的行动。这可能仅对可以保存第一响应者状态的文本字段之类的东西有用,例如,它不起作用UISwitch

由于所有 UIControl 对象都只是 UIViews,因此您还可以覆盖touchesEnded以检测与这些元素交互的结束。虽然更可接受的方式是将您的解除处理程序方法添加为所有UIControlEvents指示交互结束的操作,或者只是UIControlEventValueChanged.

Apple 文档中有关 UIResponder 的更多信息:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/resignFirstResponder

许多 UIKit 类都有指示交互何时结束的委托方法,例如UITextField有一个textFieldDidEndEditing方法。UITextView有类似的方法。

于 2012-10-31T21:25:35.077 回答