Акселерометр - встряхивания не обнаружено - Cocoa Touch - PullRequest
1 голос
/ 19 апреля 2011

Hello Я пытаюсь сделать так, чтобы, когда пользователь трясет устройство, воспроизводился звук. Однако, когда я встряхиваю его, меня выгоняют из приложения

Вот код, который я использовал

-(BOOL)canBecomeFirstResponder {
    return YES;
}


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

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

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (motion == UIEventSubtypeMotionShake)
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"whip" ofType:@"wav"];
        if (theAudio) [theAudio release];
        NSError *error = nil;
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
        if (error)
            NSLog(@"%@",[error localizedDescription]);
        theAudio.delegate = self;
        [theAudio play];    

    }

}

1 Ответ

3 голосов
/ 19 апреля 2011

Приложение не падает из-за событий встряхивания. Я только что создал небольшой тестовый проект с таким кодом:

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

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

    [self becomeFirstResponder];
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
        NSLog(@"Shake is working");
    }
}

Это ведет себя правильно. Я бы предложил закомментировать код встряхивания и заменить его простым NSLog, чтобы убедиться, что встряска работает правильно, а затем работать над этим, тестируя один фрагмент за раз.

Кроме того, в вашем коде viewDidDisappear я бы изменил порядок этих двух строк кода. (Почти) всегда, сначала делайте вызовы [super ..].

...