Macos 如何在osx中归档一个普通的蓝色立方体对象?

Macos 如何在osx中归档一个普通的蓝色立方体对象?,macos,interface-builder,archiving,Macos,Interface Builder,Archiving,我在IB中有一个纯蓝色的立方体对象,名为AppController。以下是头文件: //AppController.h #import <Cocoa/Cocoa.h> @interface AppController : NSObject <NSCoding> @property (weak) IBOutlet NSView *view; @property (assign) int numberOfPresses; - (IBAction)buttonPresse

我在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
如您所见,当用户按下按钮时,NumberOfPress会增加。当我退出应用程序并再次启动它时,我想

  • 要记住的数字
  • 视图出口仍然指向有效视图
  • 现在,对于NumberOfPress,我总是得到0,如果我尝试从AppDelegate使用NSKeyedArchiver和NSKeyedUnachiver强制存档,那么我最终得到的结果是view=null

    这个问题是从IB归档普通blue cube对象的一般问题。但是我在互联网上没有找到对此的解释,尽管这应该是一个非常常见的问题。我一定是错过了什么或者误解了什么

    要求#2应该很简单。如果不执行任何操作,则应加载
    AppController
    ,并创建其视图。从某种意义上说,它是“预归档”的

    这意味着真正的问题是如何恢复印刷机的数量。 对于这样简单的东西,
    NSUserDefaults
    可能是一个候选。在按下按钮时更新默认值,并在
    awakeFromNib
    期间检索它

    对于动态创建的完整自定义对象,自定义归档和取消归档通常比从IB加载的对象更好


    (如果您需要恢复的是一个复杂的对象网络,那么我要说的是CoreData。)

    我想要的是一个通用的解决方案,我可以在任何项目中实现,并且只使用NSCoding。(如果有人有更简单的解决方案,我很想听听)。通过引入两个对象,我最终得到了一个有效的解决方案:一个Hub和一个RootObject。这个想法可以概括为三点:

  • 这样做的目的是将所有要归档的对象从IB中释放出来

  • 引入一个负责所有IB连接的集线器对象。集线器是IB中的一个蓝色立方体,有一个到AppDelegate的出口。AppDelegate有一个到集线器的出口

  • 引入一个根对象,其目的是将存档传播到所有要存档的对象。根对象由AppDelegate拥有。AppDelegate负责启动归档和取消归档,而RootObject是中介


  • 谢谢你的回答,菲利普。正如我在问题中所说的,我知道plist(也称为NSUserDefaults),但我希望只使用自定义归档就可以完成所有工作。我的应用程序有数千行,大约有30个不同的类。其中五个是IB中的蓝色对象,它们具有出口和非出口属性。其他类动态创建实例,对于它们来说,自定义归档是合适的。CoreData对我来说太复杂了。但我会尝试将归档和NSUserDefaults结合起来,也许这样就可以了。如果成功的话,我会接受你的回答。我已经尝试让我的项目结合使用NSCoding和NSUserDefaults,但是没有成功。所以我必须用插座将物体分成两部分,一部分在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