2012-10-31 33 views
0

我有一个视图,它具有多个动态创建的UITextfields和UISegmented控件(但对于此问题的目的,还可能有UIButtons,UISwitches,UISliders或从UIControl继承的其他任何东西)。无论控件属于哪个子类,只要用户完成与任何控件的交互,我就想要执行一个动作。从查看其他问题,我想我想在创建后使用addTarget:action:forControlEvents:将观察者添加到每个控件中,但我不知道要查找哪个事件。我已经尝试了所有列入in the Apple Docs here的那些看起来很相关但不是每次都会触发的列表。我在VBA中寻找类似.LostFocus的东西,但我似乎无法找到那是什么 - 我知道有一个becomeFirstResponder方法可以使控件处于活动状态,但我找不到像“lostFirstResponder”事件。什么是处理用户与UIControl交互结束的事件?

我想我可以使用isKindOfClass来说明它是什么样的控制,并据此设置我的事件,但这看起来有点草率,我觉得应该有一个更直接的方式来做到这一点。我也可能建立了一个UITapGestureRecognizer并以这种方式建立了一些东西,但这仍然是一种解决方法,而不是它应该完成的方式。

+0

例如,用户可以与控件“A”进行交互。如果用户现在开始与第二个控件“B”进行交互,那么我将把它定义为A“失去焦点”。 – GeneralMike

回答

2

如果您愿意继承子类,则可以覆盖-resignFirstResponder以检测丢失的“焦点”并相应采取行动。这可能仅适用于可以保存第一响应者状态的文本字段,并且不适用于UISwitch。因为所有的UIControl对象都只是UIViews,所以你也可以重写touchesEnded来检测与这些元素的交互结束。尽管更为接受的方法是将你的解除处理方法添加为所有指示结束的UIControlEvents的动作的互动,或只是UIControlEventValueChanged。在UIResponder

这里更多的信息,从苹果公司的文档:

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

许多UIKit类有委托方法,标明的相互作用已经结束,例如UITextFieldtextFieldDidEndEditing方法。 UITextView有类似的方法。

+0

谢谢,我会研究这个。关于我头顶的一个问题,'touchesEnded'将如何在UITextField上工作?如果用户正在使用键盘进行交互,那么计数是否仍然在文本框内触及? – GeneralMike

+0

UIKeyboard是一个拥有自己视图的独立对象。你能更具体地说明你如何定义像UITextField这样的交互结束吗?键盘消失了吗? – yfrancis

+0

嗯,不一定,因为我知道当用户从一个文本字段到另一个文本字段时键盘不会消失。我想我会定义它,只要用户将完成在该特定文本字段中更改数据。就像开始与另一个控件交互会是一个触发器 - 实际上,只要NavBar按钮也触发它,我认为这可能是一个可行的定义。我在我的问题中添加了一条评论来指定它。 – GeneralMike

相关问题