无法在 iPhone 上获取震动事件

Posted

技术标签:

【中文标题】无法在 iPhone 上获取震动事件【英文标题】:Can't get shake events on iPhone 【发布时间】:2011-04-03 22:03:33 【问题描述】:

我。

我在这里关注了其他问题,但没有结果。我也尝试遵循 Apple 的 GLPaint 示例,但它看起来与我的源代码完全一样,只是略有不同。 GLPaint的源代码/works/,我的/doesn't/。

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

控制器.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 和一个对象,我的控制器。

我的想法已经不多了,希望有人能帮帮我。 :)

【问题讨论】:

您是否想让它与ViewViewController 一起使用? 在一个窗口中,如此处:developer.apple.com/library/ios/#samplecode/GLPaint/… 【参考方案1】:

NSNotificationCenter 的文档说:

addObserver:selector:name:object: 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];

【讨论】:

【参考方案2】:

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
    

【讨论】:

event.subtype 和 motion 在我的测试中是一样的。【参考方案3】:

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

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

【讨论】:

@MegaEduX:您尝试了我的原始代码还是修改后的答案? 我也试过 event.subtype 。 Apple 的示例检查运动,这就是我使用它的原因。反正又试了一次,没用。

以上是关于无法在 iPhone 上获取震动事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apple-Watch 上获取 iPhone 日历事件提醒

应用程序暂停时如何在 iPhone 上获取屏幕锁定/解锁事件?

Google Analytics 无法在 iPhone 上正确跟踪 HTML5 移动应用中的事件

检测iPhone底部的凹凸[重复]

无法在 iPhone 应用上使用 PhoneGap 和 jQuery 获取 JSON 结果

jQuery的on绑定事件在mobile safari(iphone / ipad / ipod)上无法使用的解决方案