将XIB链接到框架中的自定义NSView

时间:2013-06-11 02:22:30

标签: objective-c xcode macos cocoa

我正在编写Cocoa Framework(不是Application),它包含自定义NSView的定义;框架将加载到其他应用程序中,自定义的NSView将被拖动到应用程序的GUI并初始化

问题是我想在Framework

中包含一个XIB文件

我想在XIB中添加一个按钮和一个标签(在框架中),但是使用该框架的应用程序中的视图不会显示按钮和标签

我已经将XIB的文件所有者设置为框架中的自定义NSView

我还应该做些什么?

2 个答案:

答案 0 :(得分:1)

让视图加载笔尖并将笔尖中的按钮,标签等移动到自身。

最简单的方法就是获取笔尖视图的subviews并为所有这些视图执行此操作。

如果您的笔尖使用自动布局,我认为您还需要引入笔尖视图所拥有的任何约束,您可能还需要编辑或替换任何引用它的约束视图(例如,如果视图设置为距离笔尖视图的边缘X点)。

您可能还需要做额外的工作来更改新视图的框架,或者更改子视图的框架(无论是通过重定位,调整大小还是两者)以匹配为新视图指定的框架。

答案 1 :(得分:0)

是的,我刚刚解决了这个问题,我希望细节对其他人有所帮助。

在框架中,有一个复杂的NSView子类,其中包含许多控件,例如NSSplitView NSOutlineViewIKImageBrowserViewNSPathControl等;框架包含H文件,M文件和XIB文件; H和M定义MyView类;在XIB中,有一个View对象,其类为MyView

在应用程序方面,用户需要将NSView项目拖到其应用程序的主窗口上,并为视图分配一个插座,例如mainView,并在applicationDidFinishLaunching中}“消费者”应用程序的功能,以下代码是必要的

NSBundle *frameworkBundle = [NSBundle bundleForClass:[MyView class]];

NSNib *nibby = [[[NSNib alloc] initWithNibNamed:@"MyView" bundle:frameworkBundle] autorelease];

NSArray *topLevelObjects = nil;

BOOL flag = [nibby instantiateNibWithOwner:nil topLevelObjects:&topLevelObjects];

assert(flag);

for (id topLevelObject in topLevelObjects) {
    if ([topLevelObject isKindOfClass:[MyView class]]) {

        [mainView addSubview: topLevelObject];
        MyView* xView = topLevelObject;
        [xView setFrameSize:mainView.frame.size];
        break;
    }
}

在上面的代码中,加载了XIB文件,因此初始化了MyView对象,然后我们将其从XIB中取出,调整大小并将其添加到窗口的主视图中