Cocoa 界面生成器NSScrollView不使用IB定义的视图

Cocoa 界面生成器NSScrollView不使用IB定义的视图,cocoa,Cocoa,我用一个名为Drawing的drawRect定义了一个自定义类。我在笔尖中布置了视图,以包含带有绘图子视图的NSScroll视图。当我启动程序时,屏幕是空白的。有趣的是,当我以编程方式为NSScrollView创建documentView时,我在scroll视图中得到了一个图像。当我在setDocumentView中使用nib的实例时,我什么也得不到 因此,如果工程视图设置为IB [_scrollViewWorkspace setDocumentView:_drawing]; //does no

我用一个名为Drawing的drawRect定义了一个自定义类。我在笔尖中布置了视图,以包含带有绘图子视图的NSScroll视图。当我启动程序时,屏幕是空白的。有趣的是,当我以编程方式为NSScrollView创建documentView时,我在scroll视图中得到了一个图像。当我在setDocumentView中使用nib的实例时,我什么也得不到

因此,如果工程视图设置为IB

[_scrollViewWorkspace setDocumentView:_drawing]; //does not work.
但是

很好


为什么我不能在NIB中静态绑定图形对象?

当您将NIB文件中的
NSView
子类的自定义类设置为自定义类时,在运行时,将使用
initWithCoder:
而不是
initWithFrame:
创建该类的实例

通过将以下方法添加到自定义
图形
视图,可以轻松检查是否存在这种情况:

- (id)initWithCoder:(NSCoder *)coder {
   NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
   return [super initWithCoder:coder];
}
然后启动您的应用程序,查看控制台是否记录了
[Drawing initWithCoder:

如果您在
绘图
类中重写了
initWithFrame:
以进行自定义初始化(如自动设置自定义图像),则需要将相同的代码添加到
initWithCoder:
方法中,以便最终得到相同的结果:

- (id)initWithCoder:(NSCoder *)coder {
   if ((self = [super initWithCoder:coder])) {
      // do custom initialization here

   }
   return self;
}
解决了

在Interface Builder中布局视图时,我只是将自定义视图拖动到画布中的NSScrollView。我重新做了布局,所以我使用嵌入->滚动视图,它工作了


Bruce

我将代码添加到类中。什么都没有发生,什么都没有被记录。我正在ApplicationIDFinishLaunching中设置文档视图。我为initWithFrame插入了一个存根,它将我的NSLog的输出记录在那里。我认为initWithCoder不是正确的答案。它没有告诉我为什么IB中的视图的静态绑定被忽略,但是同一类的[alloc]init]在代码中工作。甚至在我设置documentView之前,图形中的drawRect也被调用。在ApplicationIDFinishLaunching中设置视图后,将不再调用它。
- (id)initWithCoder:(NSCoder *)coder {
   if ((self = [super initWithCoder:coder])) {
      // do custom initialization here

   }
   return self;
}