Сложность с доступом к списку URL в файле XML - PullRequest
1 голос
/ 29 октября 2011

Я пытаюсь создать приложение, которое воспроизводит песни в формате MP3. Мой программный поток выглядит так:

У меня есть файл XML на моем веб-сайте: http://jeewanaryal.web44.net/SongsXML/songsListXML.xml. В нем есть названия песен и фактический URL-адрес этих песен в Интернете. У меня есть следующий код для моего раздела поп-песен:

NSString *urlString = @"http://jeewanaryal.web44.net/SongsXML/songsListXML.xml";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

NSDictionary *dict = [XMLReader dictionaryForXMLData:data error:nil];

NSArray *arrayOfSongs = [[NSArray alloc] initWithArray:[[[dict objectForKey:@"list"] objectForKey:@"songs"] objectForKey:@"song"]];


StartStopSound = [UIButton buttonWithType:UIButtonTypeRoundedRect];
StartStopSound.frame = CGRectMake(60, 360, 200, 30);
[StartStopSound setTitle:@"बजाउनुहोस" forState:UIControlStateNormal];
[StartStopSound addTarget:self action:@selector(playSong) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:StartStopSound];

back = [UIButton buttonWithType:UIButtonTypeRoundedRect];
back.frame = CGRectMake(20, 320, 100, 30);
[back setTitle:@"पछाडीको गीत " forState:UIControlStateNormal];
[back addTarget:self action:@selector(playSong) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:back];

next = [UIButton buttonWithType:UIButtonTypeRoundedRect];
next.frame = CGRectMake(200, 320, 100, 30);
[next setTitle:@"अगाडीको गीत" forState:UIControlStateNormal];
[next addTarget:self action:@selector(playSong) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:next];



NSData *myData = [[NSData alloc] init ];
NSString *urlString1 = [[NSString alloc] init];


for (NSDictionary *fruitDict in arrayOfSongs) {

    UILabel *songTitle = [[UILabel alloc] initWithFrame:CGRectMake(40, 200, 300, 40)];
    songTitle.text = [NSString stringWithFormat:@"%@",[[fruitDict objectForKey:@"title"] objectForKey:@"text"]];
    [self.view addSubview:songTitle];


    urlString1 = [NSString stringWithFormat:@"%@",[[fruitDict objectForKey:@"url"] objectForKey:@"text"]];



    //NSLog(@"\n\n -- URL STRING : %@ \n\n",urlString);

}

myData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString1]];

player = [[AVAudioPlayer alloc] initWithData:myData error:nil];

[player play];
[player numberOfLoops];
[player currentTime];

Это прекрасно работает для одной песни; то есть он воспроизводит только последний URL моего файла XML. Я хочу, чтобы все песни воспроизводились одна за другой, с помощью кнопок «Далее» и «Назад» в моем приложении.

Скажите, пожалуйста, как я могу это реализовать? Я использую XMLReader.h и файл XMLReader.m для анализа данных из XML в моем приложении.

1 Ответ

0 голосов
/ 29 октября 2011

Вам нужно будет хранить arrayOfSongs где-нибудь в классе. Кнопки «Назад» и «Далее» потребуют отдельных действий (например, playPreviousSong, playNextSong). Эти методы будут выглядеть примерно так:

-(void) playPreviousSong
{
    NSString *url = [[self songs] objectAtIndex:[self songIndex] - 1];
    [self playSong:url];
    [self setSongIndex:[self songIndex - 1];
}

Это грубая реализация, чтобы показать, как она будет сочетаться. В основном вам нужно сохранить список песен и отслеживать, какая песня «выбрана» / воспроизводится, а затем просто выбрать следующую / предыдущую.

Редактировать: Чтобы ответить на ваш вопрос в комментариях, вы уже извлекли массив URL-адресов песен, вам просто нужно сохранить ссылку на него в классе. Э.Г.

@interface AudioPlayer {
    NSArray *_songs;
    NSUInteger *_songIndex;
}

Затем в @implementation вместо создания переменной arrayOfSongs просто укажите массив из переменной экземпляра:

_songs = [[NSArray alloc] initWithArray:[[[dict objectForKey:@"list"] objectForKey:@"songs"] objectForKey:@"song"]];

Затем, например, в методе playPreviousSong:

-(void) playPreviousSong
{
    NSString *url = [_songs objectAtIndex:_songIndex - 1];
    [self playSong:url];
    _songIndex--;
}
...