2013-02-22 41 views
0

我試圖在我的OS X應用程序中實現保存用戶首選項。我有一個NSTableView將其數據存儲到我的.plist文件,但我有麻煩加載相同的數據回到我的NSTableView。從未存檔的數據加載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)

回答

1

這是因爲你似乎dearchiving的對象是一個指向UserKeys類的對象,而不是一個目標,或者從NSArray的下降。當-initWithAray:碰到你的舊數組指針UserKeys時,它不知道或不關心它是什麼類,它只是發送它一個-count消息,以確定它必須增長的大小。

+0

啊,這是真的......其實問題是我以一種錯誤的方式歸檔我的數據,這就是爲什麼所有這些非歸檔都如此困惑 - – errata 2013-03-02 00:37:22