我想在UIControlEventTouchUpInside
上回复触摸事件(特别是UIControlEventTouchUpOutside
和UITextField
),但唯一的事件是UIControlEventTouchCancel
。
我不能使用UIControlEventEditingDidBegin
,因为它只会在字段获得焦点时发生,这不是我想要检测的。我想知道用户何时抬起他们的手指,无论是在文本字段的内部还是外部,无论当前的焦点状态如何。
有没有人知道实现这个目标的方法?
要明确我已尝试使用addTarget:action:forControlEvents
并且无效。取消阻止了修饰事件。我想要一种方法来检测之前 UITextField
消耗它并产生取消事件。
另外,如果可能的话,我想避免创建任何额外的视图。
答案 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];