5

さて、Xcode 4.5/iOS 6 のタブ付きアプリケーション テンプレートを使用して、以下をテストしました。

  1. タブ付きアプリケーションを作成しました。
  2. SampleButton という UIButton サブクラスを作成し、次のメソッドを実装しました。

    - (void)touchesBegan:(NSSet *)touches
               withEvent:(UIEvent *)event
    {
        [super touchesBegan:touches withEvent:event];
    }
    
    - (void)touchesCancelled:(NSSet *)touches
                   withEvent:(UIEvent *)event
    {
        [super touchesCancelled:touches withEvent:event];
    }
    
    - (void) touchesMoved:(NSSet *)touches
                withEvent:(UIEvent *)event
    {
        [super touchesMoved:touches withEvent:event];
    }
    
    - (void)touchesEnded:(NSSet *)touches
               withEvent:(UIEvent *)event
    {
        [super touchesEnded:touches withEvent:event];
    }
    
  3. この SampleButton を最初のタブに追加しました。

  4. すべてのタッチ メソッドにブレークポイントを追加しました。
  5. デバイスで実行します。
  6. すべてのタッチ メソッドが期待どおりに起動することをテストしました。
  7. SampleButton に触れてから、2 番目のタブも押します。

結果: ビューは 2 番目のタブに切り替わりますが、SampleButton で touchesCancelled および/または touchesEnded が呼び出されることはありません。そのボタンに触れている間にビューが変更された場合、それらのいずれかが起動するべきではありませんか? 私のアプリでは、そのボタンが押されている間にサウンドを再生しており、ユーザーがボタンを押しながらタブを切り替えても再生が停止しないため、これは大きな問題であることが証明されています。これは、iOS3およびiOS4で正常に機能していたようです。

4

3 に答える 3

3
于 2012-11-10T18:17:28.283 に答える
1

touch メソッドを使用する代わりに、アクションのターゲットを設定することで、これを回避しました。

[self addTarget:self action:@selector(handleKeyPressed) forControlEvents:UIControlEventTouchDown];
[self addTarget:self action:@selector(handleKeyReleased) forControlEvents:UIControlEventTouchUpInside];
[self addTarget:self action:@selector(handleKeyReleased) forControlEvents:UIControlEventTouchCancel];

ビューがスワップアウトしても、これらは正しく起動されるようです。

于 2012-11-11T04:11:58.090 に答える
1

ボタンをサブクラス化するのは難しいようです。RA が提案したように、オーディオ プレーヤーに viewDidDisappear:animated: メソッドで再生を停止するように指示するだけです。

于 2012-11-10T17:11:18.663 に答える