6

我正在制作一个应用程序,用户可以在其中选择设置选项卡中的歌曲,并根据需要在不同的视图中播放。如果用户要关闭应用程序并再次重新打开它,我想要它以便可以存储此项目。

我设法允许用户选择并存储一首歌曲:

-(IBAction)showMediaPicker:(id)sender{

    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAny];

    mediaPicker.delegate = self;

    mediaPicker.allowsPickingMultipleItems = NO;

    mediaPicker.prompt = @"Select Alarm Sound";

    [self presentModalViewController:mediaPicker animated:YES];

}


- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {

    [self dismissModalViewControllerAnimated: YES];

    settingsData.selectedSong = mediaItemCollection;//Object of type MPMediaItemCollection

但我希望用户每次使用该应用程序时都必须这样做。

我尝试过使用 NSUserDefaults:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:settingsData.selectedSong forKey:@"alarmSoundKey"];
[defaults synchronize];

但得到错误:

* -[NSUserDefaults setObject:forKey:]:尝试插入“MPMediaItemCollection”类的非属性值“”。请注意,属性列表中的字典和数组也必须只包含属性值。

请问我有什么选择?真的不知道如何解决这个问题......

解决方案 -

我还不能回答我自己的问题,所以我把它放在这里:

我找到了自己的解决方案:

首先将 MPMediaItemCollection 转换/编码为 NSData 对象,然后使用 NSUserDefaults 猛击存储它:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"someKey"];
[defaults synchronize];

从那里,您可以在应用程序的其他任何地方解码和使用......

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"someKey"];
MPMediaItemCollection *mediaItemCollection = [NSKeyedUnarchiver unarchiveObjectWithData:data]

希望这对某人有所帮助。传播这个词,这还不够。实际上已经在这个问题上工作了大约 4 个小时......

4

2 回答 2

4

您只能将属性列表值存储在 NSUserDefaults 中。由于 MPMediaItemCollection 符合 NSCoding 您可以使用 NSKeyedArchiver 来存储它。

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSKeyedArchiver_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003672

然后,您稍后使用 NSKeyedUnarchiver 将其从文件中读回。

于 2011-11-23T22:13:47.483 回答
2

您也可以使用该MPMediaItemPropertyPersistentID属性。当您的应用程序下次启动时,您可以形成一个查询以从 iPod 库中检索项目,并优雅地处理诸如用户决定从其库中删除歌曲之类的事情。

于 2012-07-17T19:32:53.753 回答