1

私はこれを iPad と iPad シミュレーターの両方でテストしましたが、1 回のシェイクが成功した後は、motionBegan メソッドが呼び出されることはありません。以下は私のプログラムの抜粋です。

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
  if(event.type == UIEventSubtypeMotionShake)
  {
    NSLog(@"Shake event occurred.");

            UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Information" message:@"Some message here" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
            alert.tag = shakeTag;
            [alert show];

  }
}

- (BOOL)canBecomeFirstResponder
{
return YES;
}

-(void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:NO];
  [self becomeFirstResponder];
}

-(void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:NO];
}

-(void)viewDidDisappear:(BOOL)animated {
  [self resignFirstResponder];
  [super viewDidDisappear:NO];
}

motionBegan メソッドが再び発生するのを妨げているのは正確には何ですか? UIAlertView を最初のシェイクで 1 回だけ表示し、その後のすべてのシェイクで却下したいと考えています。ファースト レスポンダーがまだ UIAlertView にアタッチされているため、motionBegan メソッドが再度呼び出されないようになっていると思います。

更新:私の対応する UIView には、作成された UIActionSheet があります。これは私のUIViewで呼び出されて実装されています)、UIActionSheetが画面に表示されると同時にmotionBeganメソッド(私のUIViewControllerにあります)をトリガーすると、motionBeganメソッドが呼び出せなくなるという問題が存在します。

その後、UIAlertView はどのボタン選択からも閉じられ、motionBegan メソッドは呼び出されなくなりますが、UIActionSheet は完全に正常に動作します。UIView には firstResponder の割り当てはなく、UIViewController には「canBecomeFirstResponder」のみが存在します。何か案は?

4

1 に答える 1

1
  1. そのコードはviewControllerにあるので、レスポンダーチェーンに関連するものをすべて削除してください。実際には必要ありません。自動的に作成されます。より正確には、次のものを削除できます。

    - (BOOL)canBecomeFirstResponder // remove all that method
    {
    return YES;
    }
    
      [self becomeFirstResponder]; // remove this line
    
    ...
      [self resignFirstResponder]; // remove this line
    ...
    

    これもすべてのメソッドを削除します

    -(void)viewWillDisappear:(BOOL)animated {
      [super viewWillDisappear:animated];
    }
    
  2. あなたのalertView stuff in motionEndをmotionBeganの代わりに呼び出してください。それはもっと良いかもしれません。

于 2013-03-12T12:36:19.610 に答える