我正在制作一个应用程序,用户可以在设置选项卡中选择一首歌曲,并在需要时在不同的视图中播放。如果用户关闭应用程序并重新打开它,我希望这个项目可以被保存。
我已经成功让用户使用以下代码选择和存储歌曲:
-(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个小时来解决这个问题...