我在IB中有一个名为AppController的普通蓝色立方体对象。这是头文件:
//AppController.h
#import <Cocoa/Cocoa.h>
@interface AppController : NSObject <NSCoding>
@property (weak) IBOutlet NSView *view;
@property (assign) int numberOfPresses;
- (IBAction)buttonPressed:(id)sender;
@end
正如您所看到的,它有一个视图出口,一个名为numberOfPresses的属性,以及与IB中的按钮相关联的动作。
这是实施文件
//AppController.m
#import "AppController.h"
@implementation AppController
-(void)awakeFromNib {
NSLog(@" number of presses = %d", _numberOfPresses);
}
- (IBAction)buttonPressed:(id)sender {
_numberOfPresses++;
NSLog(@" number of presses = %d", _numberOfPresses);
}
#pragma mark - Coding Protocol
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeInt:_numberOfPresses forKey:@"numberOfPresses"];
}
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
_numberOfPresses = [aDecoder decodeIntForKey:@"numberOfPresses"];
}
return self;
}
@end
如您所见,当用户按下按钮时,numberOfPresses会递增。当我退出应用程序并再次启动时,我想
现在我总是为numberOfPresses得到0,如果我尝试使用来自AppDelegate的NSKeyedArchiver和NSKeyedUnarchiver强制归档,那么我最终会得到view = null。
此问题是从IB归档普通蓝色立方体对象的一般问题。但是我没有在互联网上找到这方面的解释,尽管这应该是一个非常普遍的问题。我一定是想念或误解。
答案 0 :(得分:2)
要求#2应该很容易。如果您什么都不做,那么应该加载AppController
并创建其视图。从某种意义上说,它是“预先存档的”。
这意味着真正的问题是如何恢复按下次数。
对于那些简单的事情,NSUserDefaults
可能是候选者。在按下时更新默认值并在awakeFromNib
期间检索它。
自动归档和取消归档通常更适合动态创建的完整自定义对象,而不是从IB加载的自定义对象。
(如果它是一个复杂的对象网络,你需要恢复,我会谈论CoreData。)
答案 1 :(得分:0)
我所追求的是一个GENERAL解决方案,我可以在任何项目中实现,并且只使用NSCoding。 (如果有人有更简单的解决方案,我非常希望听到它)。我最终得到了一个有效的解决方案,它引入了两个对象:Hub和RootObject。这个想法可归纳为三点:
我们的想法是释放您想要存档的所有对象,使其不存在于IB中。
介绍一个负责所有IB连接的Hub对象。 Hub是IB中的蓝色立方体,有AppDelegate的出口。 AppDelegate有一个Hub的插座。
引入RootObject,其目的是将归档传播到您要归档的所有对象。 RootObject由AppDelegate拥有。 AppDelegate负责启动归档和取消归档,RootObject是中介。