2015-06-01 2 views
-1

В настоящее время я пытаюсь сделать приложение для плейлиста. Я пытаюсь сохранить и получить данные списка воспроизведения из NSUserDefaults. У меня нет проблем при сохранении данных, но при получении данных я получил ошибку.Как получить данные из NSUserDefaults?

я получил:

Нагрузочное приложение из-за неперехваченное исключением 'MPMediaItemCollectionInitException', причина: «-init не поддерживается, используйте -initWithItems:

Я следующий ответ от Play iPod playlist retrieved from a saved persistentid list но я стараюсь писать это быстро.

вот моя функция сохранения:

func savePlaylist(var mediaItemCollection: MPMediaItemCollection){ 

    var items: NSArray = mediaItemCollection.items 

    var listToSave: NSMutableArray = NSMutableArray() 

    for song in items{ 

     var persistentId: AnyObject! = song.valueForProperty(MPMediaItemPropertyPersistentID) 

     listToSave.addObject(persistentId) 

    } 

    var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(listToSave) 

    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "songsList") 
    NSUserDefaults.standardUserDefaults().synchronize() 

} 

и вот мой получить функцию:

func setupMusic(){ 

    if NSUserDefaults.standardUserDefaults().objectForKey("songsList") != nil{ 

     var theList: NSMutableArray = NSMutableArray() 

     var data: NSData = (NSUserDefaults.standardUserDefaults().objectForKey("songsList") as? NSData)! 

     var decodedData: NSArray = (NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSArray)! 

     theList.addObjectsFromArray(decodedData as [AnyObject]) 

     var allTheSongs: NSMutableArray = NSMutableArray() 

     for var i = 0; i < theList.count; i++ { 

      var songQuery = MPMediaQuery.songsQuery() 

      var songs: NSArray = songQuery.items 

      allTheSongs.addObject(songs) 

     } 

     var currentQueue: MPMediaItemCollection = MPMediaItemCollection() 

     myMusicPlayer?.setQueueWithItemCollection(currentQueue) 


    }else{ 
     println("fail!!!!!!!!!!!!") 
    } 

} 

Как я могу это исправить?

ответ

1

Вот вопрос var currentQueue: MPMediaItemCollection = MPMediaItemCollection()

Вы должны init с элементами

В соответствии с documentation яблоком.

INIT (пункты :) Места Initializer

Инициализирует коллекцию элементов медиа с массивом элементов мультимедиа. Декларация

Swift

INIT (пункты пункты: [AnyObject]!)! Parameters изделия

Массив элементов вы назначаете коллекции медиа-элемента.

Вы должны инициализировать с элементами как

var currentQueue: MPMediaItemCollection = MPMediaItemCollection(items:itemsArray) 
+0

где же я положил инициализации (пункты пункты:! [AnyObject])? –

+0

Откуда берутся «itemsArray»? –

+0

Ох, я понял. Спасибо за помощь –

0

Я даю вам очень простой способ любого вида объекта и извлечь из NSUserDefault. Вам не нужно явно использовать архив и разблокировать. Просто создайте категорию NSUserDefaults, как следовать

#import <Foundation/Foundation.h> 
@interface NSUserDefaults (AKSNSUserDefaults) 
- (void)saveCustomObject:(id<NSCoding>)object 
        key:(NSString *)key; 
- (id<NSCoding>)loadCustomObjectWithKey:(NSString *)key; 
@end 

@implementation NSUserDefaults (AKSNSUserDefaults) 

- (void)saveCustomObject:(id<NSCoding>)object 
        key:(NSString *)key { 
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object]; 
    [self setObject:encodedObject forKey:key]; 
    [self synchronize]; 

} 

- (id)loadCustomObjectWithKey:(NSString *)key { 
    NSData *encodedObject = [self objectForKey:key]; 
    id object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject]; 
    return object; 
} 

@end 

и чем ваш NSUserDefaults готов хранить любой объект. но в вашей объектной модели нужно использовать NSCoder.

, например:

#import <Foundation/Foundation.h> 

@interface AKSClassA : NSObject<NSCoding> 
// declared some property 
@property (nonatomic,assign) NSInteger userID; 
@property (nonatomic,strong) NSString *userName; 
@end 
#import "AKSClassA.h" 
@implementation AKSClassA 
@synthesize userID; 
@synthesize userName; 
-(id)initWithCoder:(NSCoder *)aDecoder{ 
    if (self = [super init]) { 

     self. userID = [aDecoder decodeIntegerForKey:@"userID"]; 
     self. userName = [aDecoder decodeObjectForKey:@"userName"]; 

    } 
    return self; 
} 
-(void)encodeWithCoder:(NSCoder *)aCoder{ 
    [aCoder encodeInteger:userID forKey:@"userID"]; 
    [aCoder encodeObject:userName forKey:@"userName"]; 
} 
@end 
// in some class if you are using classA object member to store and retrieve with value example below 
// to save data in NSUserDefaults 
    AKSClassA *obj =[array1 objectAtIndex:index]; 
    [[NSUserDefaults standardUserDefaults] saveCustomObject:button key:@"userData"]; 

// to retrieve data 
AKSClassA *obj1 = (AKSClassA*)[[NSUserDefaults standardUserDefaults]loadCustomObjectWithKey:@"userData"]; 

    [titleLabel setText:obj1.userName]; 
+0

, если вы используете swift, тогда вы можете использовать NSCoding в своей модели, перейдя по этой ссылке http://stackoverflow.com/questions/24238868/swift-nscoding-not-working –

Смежные вопросы