5

当我在 XCode 4.6 中创建一个新的 OSX 项目并选择 Cocoa Application 模板时,我随后在 Interface Builder 中看到的是一个 NSWindow、一个 NSMenu(预填充了一些菜单项)和一个 NSWindow 内的 NSView。但是,当我尝试删除 NSView 并将其替换为 NSTableView 或将 NSView 嵌入 NSScrollView 时,我无法这样做。

自动生成的 NSView 有什么特别之处吗?NSWindow 是否需要 NSView 位于其之上,并且不允许诸如 NSTableView 或 NSCollectionView 之类的其他子类成为层次结构中的根视图?我知道我可以更改 Identity Inspector 中的类,但这似乎无济于事。对这个新手有什么想法或提示吗?

4

1 回答 1

6

这是窗口的内容视图。所有窗口都必须有一个来包含它们的内容,因此默认情况下由窗口提供一个。虽然可以为内容视图使用您想要的任何视图(使用setContentView:代码中的方法),但 Interface Builder 目前不允许您替换它,可能是因为它可能会产生一些意想不到的结果。

除非您有充分的理由替换内容视图,否则最好将视图放入其中。您可以让您的视图占据整个区域并使用自动调整大小掩码或自动布局约束来保持这种状态。这将使您的视图看起来像是内容视图,唯一的区别是视图层次结构的额外级别。

如果你真的想改变内容视图,你可以在 Interface Builder 中通过设置一个自定义类来完成。但是,正如您所见,这不会使视图表现得像您选择的那样。Interface Builder 忽略自定义类以显示视图并选择其设置,并在运行时使用正确的类。这在大多数情况下是不可取的,因为您无法指定任何设置。

更改内容视图的更好方法是在代码中进行。您可以在 Interface Builder 中创建一个不在任何窗口中的视图,并在其中构建您的层次结构。然后,在加载 nib 之后但在显示窗口之前,您的代码将用您自己的替换窗口的默认内容视图。例如,如果一个对象具有名为windowand的属性newContentView,它可以更改内容视图并像这样显示窗口:

[self.window setContentView:self.newContentView];
[self.window makeKeyAndOrderFront:nil];
于 2013-08-15T01:54:44.213 回答