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上测试。