2014-11-14 3 views
1

Я застрял на этом некоторое время. Поэтому в моем приложении у меня будут кнопки, воспроизводящие звуки. Когда пользователь нажимает кнопку (button1.png), я хочу изменить изображение на (button2.png), а затем, когда звук закончил воспроизведение, я хочу изменить изображение pic на исходное изображение. Я думаю, что обратный вызов лучше всего настроить, но у меня проблемы. Помощь будет оценена.Как настроить функцию обратного вызова?

Вот мой код

#import "ViewController.h" 
#import <AudioToolbox/AudioToolbox.h> 

@interface ViewController() 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
[scrollView setScrollEnabled:YES]; 
// change setContentSize When making scroll view Bigger and adding more items 
[scrollView setContentSize:CGSizeMake(320, 1000)]; 

} 
- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

#pragma mark - CallBackMethods 









#pragma mark - SystemSoundIDs 
SystemSoundID sound1; 







#pragma mark - Sound Methods 
-(void)playSound1 
{ 
NSString* path = [[NSBundle mainBundle] 
        pathForResource:@"Sound1" ofType:@"wav"]; 
NSURL* url = [NSURL fileURLWithPath:path]; 
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &sound1); 


static void (^callBAck)(SystemSoundID ssID, void *something); 

callBAck = ^(SystemSoundID ssID, void *something){ 
    [button1 setImage:@"WhiteButton.png" forState:UIControlStateNormal]; 
}; 

AudioServicesAddSystemSoundCompletion(sound1, 
             NULL, 
             NULL, 
             callback, 
             NULL); 

AudioServicesPlaySystemSound(sound1); 
} 
- (IBAction)button:(id)sender { 
NSLog(@"Hello"); 
[button1 setImage:[UIImage imageNamed:@"ButtonPressed.png"] forState:UIControlStateNormal]; 
[self playSound1];  
} 
@end 

ответ

0

AudioToolbox является C рамки (обратите внимание на вызов функции стиль в C). Таким образом, обратный вызов, который вы передаете, должен быть C function pointer.

Глядя на AudioServicesSystemSoundCompletionProc типа, что вам нужно передать в качестве 4-го аргумента AudioServicesAddSystemSoundCompletion для обратного вызова:

typedef void (*AudioServicesSystemSoundCompletionProc) (SystemSoundID ssID, void *clientData);

Это говорит вам, что вы должны объявить функциюC, которая принимает два параметра и возвращает void как обработчик обратного вызова и передают его в AudioServicesAddSystemSoundCompletion.

// Declare this anywhere in the source file. 
// I would put this before @implement of the class. 
void audioCompletionHandler(SystemSoundID ssID, void *clientData) { 
    NSLog(@"Complete"); 
} 

... 

- (void)playSound { 
    ... 
    // To pass the function pointer, add & before the function name. 
    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, &audioCompletionHandler, NULL); 
    AudioServicesPlaySystemSound(sound); 
} 
Смежные вопросы