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