【问题标题】:Loading NSTableView from unarchived data从未归档的数据加载 NSTableView
【发布时间】:2013-02-22 03:32:01
【问题描述】:

我正在尝试在我的 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)

【问题讨论】:

    标签: objective-c xcode macos nstableview nscoding


    【解决方案1】:

    这是因为您似乎要取消归档的对象是指向 UserKeys 类的对象的指针,而不是 NSArray 或其后代的对象。当-initWithAray: 命中指向UserKeys 的oldArray 指针时,它不知道或不在乎它是什么类,它只是向它发送-count 消息以确定它必须增长到的大小。

    【讨论】:

    • 啊,那是真的...实际上问题是我存档数据的方式有点错误,这就是为什么所有这些取消存档都如此混乱 -.-
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多