如何在osx中​​归档纯蓝色立方体对象?

时间:2015-06-26 11:23:04

标签: macos interface-builder archiving

enter image description here

我在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会递增。当我退出应用程序并再次启动时,我想

  1. 要记住的numberOfPresses。
  2. stil的视图出口指向有效视图。
  3. 现在我总是为numberOfPresses得到0,如果我尝试使用来自AppDelegate的NSKeyedArchiver和NSKeyedUnarchiver强制归档,那么我最终会得到view = null。

    此问题是从IB归档普通蓝色立方体对象的一般问题。但是我没有在互联网上找到这方面的解释,尽管这应该是一个非常普遍的问题。我一定是想念或误解。

2 个答案:

答案 0 :(得分:2)

要求#2应该很容易。如果您什么都不做,那么应该加载AppController并创建其视图。从某种意义上说,它是“预先存档的”。

这意味着真正的问题是如何恢复按下次数。 对于那些简单的事情,NSUserDefaults可能是候选者。在按下时更新默认值并在awakeFromNib期间检索它。

自动归档和取消归档通常更适合动态创建的完整自定义对象,而不是从IB加载的自定义对象。

(如果它是一个复杂的对象网络,你需要恢复,我会谈论CoreData。)

答案 1 :(得分:0)

我所追求的是一个GENERAL解决方案,我可以在任何项目中实现,并且只使用NSCoding。 (如果有人有更简单的解决方案,我非常希望听到它)。我最终得到了一个有效的解决方案,它引入了两个对象:Hub和RootObject。这个想法可归纳为三点:

  1. 我们的想法是释放您想要存档的所有对象,使其不存在于IB中。

  2. 介绍一个负责所有IB连接的Hub对象。 Hub是IB中的蓝色立方体,有AppDelegate的出口。 AppDelegate有一个Hub的插座。

  3. 引入RootObject,其目的是将归档传播到您要归档的所有对象。 RootObject由AppDelegate拥有。 AppDelegate负责启动归档和取消归档,RootObject是中介。