Трудности с доступом к списку URL-адресов в XML-файле

#objective-c #ios #cocoa-touch #nsdata

#objective-c #iOS #cocoa-touch #nsdata

Вопрос:

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

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

 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(@"nn -- URL STRING : %@ nn",urlString);

}

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

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

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

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

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

Ответ №1:

Вам нужно будет хранить 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--;
}
 

Комментарии:

1. Привет @Sebnow, спасибо за ваш быстрый ответ, я использовал его как массив словаря, пожалуйста, объясните мне подробно, как я могу сохранить URL песен. Просто нужно знать, как извлечь URL-адрес из массива этого словаря … еще раз спасибо