我已经在 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”。有任何想法吗?