1

我已经在 iPad 和 iPad 模拟器上对此进行了测试,并且在一次成功摇动后,从未调用过 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 在第一次摇动时只显示一次,并在所有后续摇动时被关闭。我有一种预感,First Responder 仍然连接到 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. 在motionEnd而不是motionBegan中调用您的alertView内容。它可以更好。

于 2013-03-12T12:36:19.610 回答