Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 声音播放完毕后执行代码的最佳方式_Iphone_Objective C_Ios_Audio - Fatal编程技术网

Iphone 声音播放完毕后执行代码的最佳方式

Iphone 声音播放完毕后执行代码的最佳方式,iphone,objective-c,ios,audio,Iphone,Objective C,Ios,Audio,我希望在声音播放完毕后执行一些代码,但不知道最好的方法是什么。我已经看过了performSelectorOnMainThread…,但没有完全理解它——即使如此,我也不确定这是否是解决问题的最佳方法。我想在声音播放完毕后更改标签的文本颜色。我非常感谢你的帮助。我的代码如下: -(void) playWordSound:(UILabel *)label { NSString *path; SystemSoundID soundId; switch (label.tag)

我希望在声音播放完毕后执行一些代码,但不知道最好的方法是什么。我已经看过了
performSelectorOnMainThread…
,但没有完全理解它——即使如此,我也不确定这是否是解决问题的最佳方法。我想在声音播放完毕后更改标签的文本颜色。我非常感谢你的帮助。我的代码如下:

-(void) playWordSound:(UILabel *)label
{
    NSString *path;
    SystemSoundID soundId;
    switch (label.tag)
    {
        case 1:
            path = [[NSBundle mainBundle] pathForResource:@"humpty" ofType:@"wav"];
            break;
        case 2:
            path = [[NSBundle mainBundle] pathForResource:@"dumpty" ofType:@"wav"];
            break;
        case 3:
            path = [[NSBundle mainBundle] pathForResource:@"saty" ofType:@"wav"];
            break;
        case 4:
            path = [[NSBundle mainBundle] pathForResource:@"on 2" ofType:@"wav"];
            break;
        case 5:
            path = [[NSBundle mainBundle] pathForResource:@"a 3" ofType:@"wav"];
            break;
        case 6:
            path = [[NSBundle mainBundle] pathForResource:@"wall" ofType:@"wav"];
            break;
    }
        NSURL *url = [NSURL fileURLWithPath:path];
        AudioServicesCreateSystemSoundID( (CFURLRef)objc_unretainedPointer(url), &soundId);
    AudioServicesPlaySystemSound(soundId); 
    //this is where i want to change the color of the label
}

此方法可以帮助您:

OSStatus AudioServicesAddSystemSoundCompletion (
   SystemSoundID                           inSystemSoundID,
   CFRunLoopRef                            inRunLoop,
   CFStringRef                             inRunLoopMode,
   AudioServicesSystemSoundCompletionProc  inCompletionRoutine,
   void                                    *inClientData
);

使用AVPlayerItem并添加事件AVPlayerItemDidPlayToEndTimeNotification的观察者

e、 g


谢谢你的回答。我的.h文件中有
#import#import
,但是我得到了一些错误-
itemStatusContext
player
都抛出了未声明的标识符错误您只需要AVFoundation,但您必须声明所有变量,上面的代码只是一个片段,您仍然需要声明一个“AVQueuePlayer*player”和一个“static const NSString*ItemStatusContext”。查看Xcode文档中的播放系统指南。
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
[playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext];
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                             object:playerItem];
player = [AVQueuePlayer playerWithPlayerItem:playerItem];
[player play];
- (void)playerItemDidReachEnd:(NSNotification *)notification {
    // Do stuff here
}