13

ここで明らかな何かが欠けているに違いありませんが...

UIControl にはメソッドがあります

- (void)addTarget:(id)target action:(SEL)action forControlEvents: (UIControlEvents)controlEvents

これにより、指定された controlEvents のいずれかが発生したときに呼び出されるアクションを追加できます。ControlEvents は、タッチがダウンしたか、内部でアップしたか、ドラッグされたかなどを示すイベントのビットマスクです。約 16 個あります。ユーザーまたはそれらを合わせて、それらのいずれかが発生したときに呼び出されます。

セレクターは、次のいずれかの署名を持つことができます

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)

制御イベントのビットマスクが何であったかを示すものはありません。UIEvent は少し異なります。実際のタッチ イベントに関連しており、(私が思うに) UIControlEvent は含まれていません。送信者 (UIControl) にも、コントロール イベントを見つける方法がありません。

どのイベントが発生したかに関係なく、いくつかの共通コードがあるため、多数のコントロール イベントを処理する 1 つのメソッドが必要ですが、特定の処理のために UIControlEvents が何であったかを知る必要があります。

アクションが呼び出されたときにどの UIControlEvents が使用されたかを確認する方法がありませんか、それともコードを次のように分割する必要がありますか?

- (void)actionWithUIControlEventX;
- (void)actionWithUIControlEventY;
4

2 に答える 2

5

私は同じ問題に遭遇し、解決策を思いつきました。驚くほどきれいではありませんが、かなりうまく機能します。これは、最後に起動されたUIControlEventを独自のタグプロパティに格納するUIControlカテゴリです。以下のリンクから入手できます。さらなる参考のために、これが私のカテゴリーのドキュメントであり、何が起こっているのかについてのより詳細な説明があります。

うまくいけば、これが役立ちます!乾杯/J

UIControl + CaptureUIControlEvents

git gist at: http: //gist.github.com/513796

問題:起動時に、UIControlEventsが特定のイベントに割り当てられたターゲットアクションに渡されません。これは、発生したUIControlEventに基づいて切り替わるアクションを1つだけにするために役立ちます。

解決策:UIEventでトリガーされたUIControlEventを保存する方法を追加します。

問題:ただし、プライベートAPIをオーバーライドすることはできないため、次のようになります。(悪い)解決策:UIControlにUIControlEventを最後に起動して保存させます。

UIControlのドキュメントには、次のように記載されています。

ユーザーが1つ以上の指定されたイベントに対応する方法でコントロールに触れると、UIControlは自分自身にsendActionsForControlEvents:を送信します。これにより、UIControlはsendAction:to:from:forEvent:メッセージでアクションをUIApplicationに送信します。

sendActionsForControlEvents:をオーバーライド(またはサブクラス化)してフラグを格納できると思うかもしれませんが、そうではありません。sendActionsForControlEvents:は、主にクライアントがプログラムでイベントをトリガーするために存在するようです。

代わりに、追跡する制御イベントごとにアクションを登録するスキームを設定する必要がありました。パフォーマンスと使いやすさのために、すべてのイベント(またはすべてのUIControls)を追跡しないことにしました。

使用例:

UIControlのセットアップ:

UIControlEvents capture = UIControlEventTouchDown;
capture |= UIControlEventTouchDown;
capture |= UIControlEventTouchUpInside;
capture |= UIControlEventTouchUpOutside;
[myControl captureEvents:capture];
[myControl addTarget:self action:@selector(touch:) forControlEvents:capture];

そして、ターゲットアクション:

- (void) touch:(UIControl *)sender {
  UIColor *color = [UIColor clearColor];
  switch (sender.tag) {
    case UIControlEventTouchDown: color = [UIColor redColor]; break;
    case UIControlEventTouchUpInside: color = [UIColor blueColor]; break;
    case UIControlEventTouchUpOutside: color = [UIColor redColor]; break;
  }
  sender.backgroundColor = color;
}
于 2010-08-08T09:15:39.473 に答える
0

UIControl を作成するときに、tag プロパティの値を設定します。次に、アクション関数で、[送信者タグ] を使用して、それを呼び出した UIControl のタグを特定できます。次に例を示します。

-(void)viewDidLoad {
    UIButton *button1 = [[UIButton alloc] initWithFrame(CGRectMake(0.0,0.0,100.0,100.0)];
    button1.tag = 42;
    [button1 addTarget:self action:@selector(actionWithUIControlEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];


    UIButton *button2 = [[UIButton alloc] initWithFrame(CGRectMake(100.0,0.0,100.0,100.0)];
    button2.tag = 43;
    [button2 addTarget:self action:@selector(actionWithUIControlEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button2];

}
-(void)actionWithUIControlEvent:(id)sender {
     switch([sender tag]) {
     case 42:
         //Respond to button 1
         break;
     case 43:
         //Respond to button 2
         break;
     default:
         break;
     }
 }
于 2010-04-21T19:47:19.913 に答える