2012-01-10 11 views
18

UITextFieldのタッチイベント(具体的にはUIControlEventTouchUpInsideUIControlEventTouchUpOutside)に応答したいのですが、唯一のイベントはUIControlEventTouchCancelです。UITextFieldのタッチイベントにどのように応答できますか?

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

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

明らかに私はaddTarget:action:forControlEventsを使用しようとしました。は動作しません。タッチアップイベントはキャンセルによって防止されます。私はのタッチアップを検出する方法を、の前にUITextFieldが消費し、Cancelイベントを生成します。

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

答えて

-1

プログラムで目的のイベントのターゲットを追加するか、IBを使用します。

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

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

いいえ、間違いなく動作しません。私が最初に試したこと。 "yourDesiredMethod"メソッドは呼び出されません。 UIControlEventTouchDownのイベントを取得できますが、どちらのTouchUpイベントも起動されません。代わりに、UIControlEventTouchCancelイベントが発生します。長いイベントで倍率ループが発生したり、モーダルダイアログやロック画面などのユーザー入力を取り消したときにも起動されるため、そのイベントをハッキープロキシとして使用することはできません。 – theK42

+0

うわー、私はそれが他のUIViewベースのクラスのように動作すると思った。カスタムUITextFieldを作成し、touchesBegan:メソッドをオーバーライドして、適切な場合に最初のレスポンダになり、キーボードがまだ表示されるようにすることができます。 –

+0

私はtouchesBegan/Ended/Cancelledを上書きしようとしましたが、EndedイベントのないBegan/Cancelledのペアも与えました。これは本当にイライラしています!また、これらのメソッドをオーバーライドしても、textFieldが最初のレスポンダになるのを防ぐことができなかったので、チャンスを得る前に基本クラスがタッチ処理を行っています。 – theK42

4

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

+0

イベントがTextFieldの内部に触れることができないため、これは機能しません。可能であれば、余分なビューを作成しないようにしたいと思います。 – theK42

2

良い答え: Change default touch events for UITextField

テキストフィールドのデリゲートを使用して、あなたがtextFieldShouldBeginEditingでやりたい:

あなたはデフォルトの動作を防ぐためにNOを返すことができます。

+0

それは役に立たない情報ではなく、私が望む振る舞いに近づくのに役立ちます。 UIControlEventTouchUpOutsideのように、フィールドの内側で始まりフィールド外で終了するタッチを検出するのに役立ちませんので、完全な答えではありません。 – theK42

+0

もちろん。私はあなたの質問を正しく読むべきでした! – beev

+0

ここでは注意が必要です。このメソッドは、たとえばテキストフィールドを横断するために外付けキーボードのタブを押すときのように、単にタップするよりも多くの場合トリガします。 iOS 9でテスト済みです。 –

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 
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 
関連する問題