我正在创建一个应用程序,用户可以在设置选项卡中选择一首歌曲,并根据需要在不同的视图中播放。我想要它,以便如果用户要关闭应用程序并再次打开它,则可以存储此项目。
我已设法允许用户选择并存储一首歌曲:
-(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个小时......
答案 0 :(得分:4)
您只能在NSUserDefaults中存储属性列表值。由于MPMediaItemCollection符合NSCoding,您可以使用NSKeyedArchiver来存储它。
然后使用NSKeyedUnarchiver稍后将其从文件中读回来。
答案 1 :(得分:2)
您还可以使用MPMediaItemPropertyPersistentID
属性。您可以在下次启动应用程序时形成查询以从iPod库中检索项目,并优雅地处理用户决定从其库中删除歌曲的内容。