Загрузка NSTableView из разархивированных данных

Я пытаюсь реализовать сохранение пользовательских настроек в моем приложении OS X. У меня есть NSTableView, который хранит свои данные в моем файле .plist, но у меня возникают проблемы с загрузкой тех же данных обратно в мой NSTableView.

Мой объект модели:

#import <Foundation/Foundation.h>

@interface UserKeys : NSObject <NSCoding>

@property (nonatomic, copy) NSString *userKeyName;
@property (nonatomic, copy) NSString *userApi;
@property (nonatomic, copy) NSString *userCode;

@end

и его реализация:

#import "UserKeys.h"

@implementation UserKeys

- (id)init
{
    self = [super init];
    if (self) {
        //
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        self.userKeyName = [aDecoder decodeObjectForKey:@"userKeyName"];
        self.userApi = [aDecoder decodeObjectForKey:@"userApi"];
        self.userCode = [aDecoder decodeObjectForKey:@"userCode"];
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)enCoder {
    [enCoder encodeObject:self.userKeyName forKey:@"userKeyName"];
    [enCoder encodeObject:self.userApi forKey:@"userApi"];
    [enCoder encodeObject:self.userCode forKey:@"userCode"];

}

@end

Мои настройки просмотра заголовка контроллера:

#import <Cocoa/Cocoa.h>
#import "MASPreferencesViewController.h"
#import "UserKeys.h"

@interface PreferencesApiKeysViewController : NSViewController <MASPreferencesViewController>

@property (strong) NSMutableArray *allKeys;

@end

и его реализация:

#import "PreferencesApiKeysViewController.h"
#import "UserKeys.h"

@interface PreferencesApiKeysViewController ()

@property (weak) IBOutlet NSTableView *keysTableView;

@end

@implementation PreferencesApiKeysViewController

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle {
    if ((self = [super initWithNibName:nibName bundle:bundle])) {
        self.allKeys = [NSMutableArray array];
    }
    return self;
}

// delegating....
//

- (void)viewWillAppear {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:@"UserKeys"];
    if (data != nil) {
        NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        if (oldArray != nil) {
            self.allKeys = [[NSMutableArray alloc] initWithArray:oldArray];
        } else {
            self.allKeys = [NSMutableArray array];
        }
    }
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    // some code...
    return cellView;
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return [self.allKeys count];
}

Ошибка, которую я получаю:

-[UserKeys count]: unrecognized selector sent to instance 0x100534df0

Когда я ставлю точку останова в - (void)viewWillAppear, я вижу, что data имеет около 250 байт, но этот oldArray кажется пустым. Я понимаю, что здесь я делаю серьезную ошибку с self.allKeys, так что моя таблица не знает, сколько строк она должна создать, но после множества попыток получить правильные данные я действительно не понимаю, почему это происходит.

Итак, как правильно разархивировать мои данные и представить их в NSTableView?
(я использую Xcode 4.6)


person errata    schedule 22.02.2013    source источник


Ответы (1)


Это связано с тем, что объект, который вы разархивируете, является указателем на объект класса UserKeys, а не на объект, который является потомком NSArray. Когда -initWithAray: достигает вашего указателя oldArray на UserKeys, он не знает или ему все равно, какой это класс, он просто отправляет ему сообщение -count, чтобы определить размер, до которого он должен вырасти.

person CodaFi    schedule 02.03.2013
comment
Ах, это правда... На самом деле проблема была в том, что я архивировал свои данные немного не так, поэтому вся эта разархивация была такой запутанной -.- - person errata; 02.03.2013