iOS: как избежать наложения звука / музыки в PickerViewController - PullRequest
0 голосов
/ 04 января 2012

У меня есть один музыкальный проигрыватель с несколькими звуками, используя вид выбора. Моя проблема в том, что когда я щелкаю следующую музыку, предыдущая будет перекрываться с той, которую я выбрал. Значит, когда я прокручиваю окно выбора, чтобы выбрать новый объект, он будет воспроизводить новую музыку / звук, но предыдущий объект будет перекрываться текущий выбор. Я хочу остановить предыдущую музыку, чтобы она не перекрывалась. Вот код.

H Файл:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface PickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource, AVAudioPlayerDelegate>{

    UIPickerView       *picker;
    UILabel            *musicTitle;
    NSMutableArray     *musicList;
    AVAudioPlayer      *audioPlayer;


}


@property (nonatomic, retain) IBOutlet UIPickerView *picker;
@property (nonatomic, retain) IBOutlet UILabel *musicTitle;
@property (nonatomic, retain) NSMutableArray *musicList;

-(IBAction)playSelectedMusic:(id)sender;


@end

М Файл:

     - (void)viewDidLoad
        {
            [super viewDidLoad];
             musicList = [[NSMutableArray alloc] initWithObjects:@"m1",@"m2",@"m3",@"m6",@"m4", @"m5",nil];
        }

    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component


    {



        if ([[musicList objectAtIndex:row] isEqual:@"m1"])
        {

            NSString *path = [[NSBundle mainBundle] pathForResource:@"m1" ofType:@"mp3"];
            AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

            pickerView.delegate = self;
            [theAudio play];
 [theAudio setCurrentTime:0.0]; (our friend from this forum have suggested this but still doens't work)

            NSString *resultString = [[NSString alloc] initWithFormat:
                                      @"m1",
                                      [musicList objectAtIndex:row]];
            musicTitle.text = resultString;


        }


        if ([[musicList objectAtIndex:row] isEqual:@"m2"])
        {

            NSString *path = [[NSBundle mainBundle] pathForResource:@"m2" ofType:@"mp3"];
            AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

            pickerView.delegate = self;
            [theAudio play];
            [theAudio setCurrentTime:0.0]; (our friend from this forum have suggested this but still doens't work)



            NSString *resultString = [[NSString alloc] initWithFormat:
                                      @"m2",
                                      [musicList objectAtIndex:row]];
            musicTitle.text = resultString;


        }

Поправка к коду:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"you" ofType:@"mp3"];
        NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

        AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:file error:NULL];

        [file release];

        self.audioPlayer = theAudio;
        [theAudio release];

        [audioPlayer prepareToPlay];
        [audioPlayer setDelegate:self];
        [audioPlayer setNumberOfLoops:0];
        [audioPlayer stop];

моя глупая ошибка:

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

1 Ответ

1 голос
/ 04 января 2012

Просто остановите воспроизводимый в данный момент звук, прежде чем запускать другой, ваш AVAudioPlayer - это ивар, чтобы вы могли это сделать. Добавить

[theAudio stop];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...