Ios 如何响应UITextField上的触摸事件?
我想在Ios 如何响应UITextField上的触摸事件?,ios,uitextfield,Ios,Uitextfield,我想在UITextField上响应触摸事件(特别是UIControlEventTouchUpInside和uicontroleventTouchOutside),但唯一通过的事件是UIControlEventTouchCancel 我不能使用uicontrolEventEditingDidBeagin,因为它只在字段获得焦点时发生,我不想检测到焦点。我想知道用户何时抬起手指,不管当前焦点状态如何,手指是在文本字段的内部还是外部 有人知道实现这一目标的方法吗 我已经尝试过使用addTarget:a
UITextField
上响应触摸事件(特别是UIControlEventTouchUpInside
和uicontroleventTouchOutside
),但唯一通过的事件是UIControlEventTouchCancel
我不能使用uicontrolEventEditingDidBeagin
,因为它只在字段获得焦点时发生,我不想检测到焦点。我想知道用户何时抬起手指,不管当前焦点状态如何,手指是在文本字段的内部还是外部
有人知道实现这一目标的方法吗
我已经尝试过使用addTarget:action:forControlEvents
,但它不起作用。“取消”会阻止补漆事件。我想要一种在UITextField
使用它并产生取消事件之前检测修补的方法
此外,如果可能的话,我希望避免创建任何额外的视图。以编程方式为所需事件添加目标,或者使用IB
UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)];
[touchyTextField addTarget:self
action:@selector(yourDesiredMethod)
forControlEvents:UIControlEventTouchUpInside];
一个大概的方法是创建一个UIButton,填充设置为clear以覆盖所有空间,并在其顶部创建一个UIExtField。如果用户在文本字段内触摸,文本字段应发送事件,如果用户在文本字段外触摸,UIButton将发送事件。此处回答正确: 使用文本字段的委托,在文本字段shouldbeginediting中执行您想要执行的操作:
您可以返回NO以防止默认行为。我今天刚刚遇到了这个问题。我的目标是在触碰时更改textfield的背景色,并在触碰/取消时将其还原。 从UITextField向目标发送触碰是很奇怪的,但内部触碰、外部触碰甚至触碰取消都不是。 我找到了解决办法。这很简单。只需创建UITextField的子类,并覆盖touchesend:和touchecancelled:
@interface TextField : UITextField
@end
@implementation CuteTextField
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesEnded:touches withEvent:event];
self.backgroundColor=GetDefaultBackgroundColor();
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesCancelled:touches withEvent:event];
self.backgroundColor=GetDefaultBackgroundColor();
}
@end
您可以为UiView创建类别,并按如下所示覆盖触摸方式 它对我来说很好。它是这个问题的集中解决方案
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
不,那肯定不行。我试过的第一件事。永远不会调用“yourDesiredMethod”方法。我可以获取uicontrol事件触地的事件,但两个触地事件均未触发。而是触发UIControlEventTouchCancel事件。我也不能仅仅将该事件用作我想要的事件的黑客代理,因为当长按打开放大循环时,以及当其他东西取消用户输入时(如模式对话框或锁屏),也会触发该事件。哇,我假设它与任何其他基于UIView的类一样工作。您可以创建一个自定义UITextField并覆盖touchesBegind:方法,确保在适当的情况下成为第一响应者,以便键盘仍然显示。因此,我尝试覆盖touchesBegind/End/Cancelled,这也给了我一个开始/取消对,没有结束事件。这真令人沮丧!另外,重写这些方法并没有阻止textField成为第一响应者,所以在我有机会之前,基类正在进行触摸处理!您可以在TextField中处理内部触摸。应在UITextFieldDelegate中开始编辑。由于我无法通过在TextField中触摸获取事件,因此这将不起作用。如果可能的话,我也希望避免创建任何额外的视图。这不是无用的信息,它可以帮助我更接近我想要的行为。但这不是一个完整的答案,因为它不能帮助我检测到像
UIControlEventTouchUpOutside
那样在字段内部开始和外部结束的触摸。这里需要提醒一下。这种方法在很多情况下都会触发,而不仅仅是点击,例如当按下外部键盘上的tab键来遍历文本字段时。在iOS 9上测试。