UIControlEventTouchUpInside
のタッチイベント(具体的にはUIControlEventTouchUpOutside
とUITextField
)に応答したいのですが、発生するイベントはUIControlEventTouchCancel
だけです。
UIControlEventEditingDidBegin
は使用できません。これは、フィールドがフォーカスを取得したときにのみ発生するためです。これは、私が検出しようとしているものではありません。現在のフォーカス状態に関係なく、ユーザーがいつ指を離したか、テキストフィールドの内側か外側かを知りたいです。
誰かがこれを達成する方法を知っていますか?
明確にするために、私はaddTarget:action:forControlEvents
を使用してみましたが、それは機能しませんです。修正イベントはキャンセルによって防止されます。タッチアップを検出する方法が必要ですbeforeUITextField
がそれを消費し、Cancelイベントを生成します。
また、可能であれば余分なビューを作成しないようにしたいと思います。
それを行う方法については、すべてのスペースをカバーするように塗りつぶしをクリアに設定してUIButtonを作成し、その上にUITextFieldを作成することです。ユーザーがテキストフィールドをタッチすると、テキストフィールドはイベントを送信する必要があり、ユーザーがテキストフィールドの外側をタッチすると、UIButtonがイベントを送信します。
ここでの良い答え: ITextFieldのデフォルトのタッチイベントを変更
テキストフィールドのデリゲートを使用して、textFieldShouldBeginEditingで実行したいことを実行します。
NOを返すと、デフォルトの動作を防ぐことができます。
次のように、UiViewのカテゴリを作成し、touchesBeganミートホッドをオーバーライドできます。
それは私にとってはうまく機能しています。そしてそれはこの問題の集中化ソリューションです。
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
私は今日この問題に直面しました。私の目標は、タッチダウン時にテキストフィールドの背景色を変更し、タッチアップ/キャンセル時に元に戻すことでした。タッチダウンが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