如何响应UITextField上的触摸事件?

时间:2012-01-10 02:06:14

标签: ios uitextfield

我想在UIControlEventTouchUpInside上回复触摸事件(特别是UIControlEventTouchUpOutsideUITextField),但唯一的事件是UIControlEventTouchCancel

我不能使用UIControlEventEditingDidBegin,因为它只会在字段获得焦点时发生,这不是我想要检测的。我想知道用户何时抬起他们的手指,无论是在文本字段的内部还是外部,无论当前的焦点状态如何。

有没有人知道实现这个目标的方法?

要明确我已尝试使用addTarget:action:forControlEvents并且无效。取消阻止了修饰事件。我想要一种方法来检测之前 UITextField消耗它并产生取消事件。

另外,如果可能的话,我想避免创建任何额外的视图。

5 个答案:

答案 0 :(得分:4)

关于这样做的方法是创建一个UIButton,其中填充集清除以覆盖所有空间,并在其上面创建一个UITextField。如果用户触摸文本字段,则文本字段应发送事件,如果用户触摸文本字段之外,UIButton将发送事件。

答案 1 :(得分:2)

这里的答案很好: Change default touch events for UITextField

使用文本字段的委托,并在textFieldShouldBeginEditing中执行您要执行的操作:

您可以返回NO以防止默认行为。

答案 2 :(得分:1)

您可以为UiView创建类别并覆盖touchesBegan meathod,如下所示。

它对我来说很好。它是这个问题的集中解决方案。

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:true];
    [super touchesBegan:touches withEvent:event];
}


@end

答案 3 :(得分:0)

我今天才遇到这个问题。我的目标是在触摸时更改文本字段的背景颜色,并在触摸/取消时将其还原。 触摸下来从UITextField发送到目标是奇怪的,但是内部触摸,外部触摸甚至触摸取消都不是。 我找到了解决方案。很简单。只需创建一个UITextField的子类并覆盖touchesEnded:和touchesCancelled:。

@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

答案 4 :(得分:-1)

以编程方式为您想要的事件添加目标,或者使用IB。

UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)];

[touchyTextField addTarget:self 
                    action:@selector(yourDesiredMethod) 
          forControlEvents:UIControlEventTouchUpInside];