无法在iPhone上获得震动事件

时间:2011-04-03 22:03:33

标签: iphone cocoa-touch shake motion-detection

我无法在iPhone上获得震动事件。

我在这里跟随其他问题没有结果。我也尝试过关注Apple的GLPaint示例,但它看起来与我的源代码完全一样,但差别很小。 GLPaint的源代码/ works /,我的/没有/.

所以,这就是我所拥有的:

Controller.m或者

- (void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeEnded) name:@"shake" object:nil];
}

ShakingEnabledWindow.m

- (void)shakeEnded {
    NSLog(@"Shaking ended.");
}

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if (motion == UIEventSubtypeMotionShake ) {
        // User was shaking the device. Post a notification named "shake".
        [[NSNotificationCenter defaultCenter] postNotificationName:@"shake" object:self];
        NSLog(@"Shaken!");
    }
}

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
}

我的XIB有一个窗口,它是一个ShakingEnabledWindow和一个对象,我的控制器。

我这里的想法已经不多了,希望有人可以帮我一臂之力。 :)

3 个答案:

答案 0 :(得分:1)

NSNotificationCenter的文档说:

  

<强>的addObserver:选择器:名称:对象:    notificationSelector 选择器   指定接收者的消息   发送notificationObserver通知   它的通知发布。该   方法指定   notificationSelector 必须有一个和   只有一个参数(一个实例)   NSNotification)。

所以你的shakeEnded方法是错误的,因为它不需要参数。它应该看起来:

- (void)shakeEnded:(NSNotification*)notiication {
    NSLog(@"Shaking ended.");
}

- (void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeEnded:) name:@"shake" object:nil];
}

答案 1 :(得分:1)

viewDidAppear中,成为第一个响应者:

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

确保你能成为第一响应者:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

然后你可以实现运动检测。

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (event.subtype == UIEventTypeMotion){
        //there was motion
    }
}

答案 2 :(得分:0)

我认为您错误地检查了动作类型。您需要检查event.subtype而不是motion

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if ( event.subtype == UIEventSubtypeMotionShake ) {
        // Put in code here to handle shake
    }
}