web-dev-qa-db-ja.com

UITextFieldのタッチイベントに応答するにはどうすればよいですか?

UIControlEventTouchUpInsideのタッチイベント(具体的にはUIControlEventTouchUpOutsideUITextField)に応答したいのですが、発生するイベントはUIControlEventTouchCancelだけです。

UIControlEventEditingDidBeginは使用できません。これは、フィールドがフォーカスを取得したときにのみ発生するためです。これは、私が検出しようとしているものではありません。現在のフォーカス状態に関係なく、ユーザーがいつ指を離したか、テキストフィールドの内側か外側かを知りたいです。

誰かがこれを達成する方法を知っていますか?

明確にするために、私はaddTarget:action:forControlEventsを使用してみましたが、それは機能しませんです。修正イベントはキャンセルによって防止されます。タッチアップを検出する方法が必要ですbeforeUITextFieldがそれを消費し、Cancelイベントを生成します。

また、可能であれば余分なビューを作成しないようにしたいと思います。

18
theK42

それを行う方法については、すべてのスペースをカバーするように塗りつぶしをクリアに設定してUIButtonを作成し、その上にUITextFieldを作成することです。ユーザーがテキストフィールドをタッチすると、テキストフィールドはイベントを送信する必要があり、ユーザーがテキストフィールドの外側をタッチすると、UIButtonがイベントを送信します。

4
brandonbocklund

ここでの良い答え: ITextFieldのデフォルトのタッチイベントを変更

テキストフィールドのデリゲートを使用して、textFieldShouldBeginEditingで実行したいことを実行します。

NOを返すと、デフォルトの動作を防ぐことができます。

2
beev

次のように、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
1
Hiren

私は今日この問題に直面しました。私の目標は、タッチダウン時にテキストフィールドの背景色を変更し、タッチアップ/キャンセル時に元に戻すことでした。タッチダウンが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
0
fnc12