我的应用程序的布局类似于iTunes。主窗口是NSSplitView。
根据用户在左栏中选择的内容,我需要显示不同的视图。例如,在iTunes中,如果你点击“音乐”,你会看到一个表格中的歌曲列表,如果你点击“电视节目”,我会看到一个带有一些文字的白色屏幕。
多年来一直试图解决这个问题,任何指向正确方向的指针都会非常方便!
答案 0 :(得分:5)
在NSSplitView
的右侧窗格中,您可以放置一个无标签的NSTabView
。视图的每个选项卡都可以包含您要显示的视图之一。然后,在大纲视图的委托中,只需要选项卡视图以在选择特定项目时显示相应的视图。
答案 1 :(得分:2)
这实际上是NSViewController的工作。使用这意味着您可以将每个视图放入单独的nib文件中,然后根据需要交换它们。当你需要交换视图时,你可以做这样的事情(假设你在NSSplitView的右侧窗格中有一个NSBox)
NSView *musicView = [musicViewController view];
[rightPaneBox setContentView:musicView];
编辑以获得更全面的示例:
例如,如果您有音乐视图和电视视图。您将创建两个新的nib文件,比如MusicView.nib和TVView.nib,并在其中设计您的视图。然后,您将创建两个NSViewController,MusicViewController和TVViewController的子类。在你的每个人的init方法中你调用[super initWithNib:@“MusicView.nib”bundle:nil]。
然后在选择新视图的方法中,调用[musicViewController视图]以获取放置在NSSplitView右侧的视图。
答案 2 :(得分:1)
如果您对将要“更改”的视图有引用,您可以在某些delgate方法中添加一个新视图作为其子视图。
答案 3 :(得分:1)
在尝试了各种不起作用的东西后,我找到了不同的解决方案。方法-replaceSubview:with:几乎完全正确。要切换视图,您只需存储隐藏的视图以供日后使用。
要确保视图的位置和大小正确,请先将当前视图中的帧复制,然后再将其替换为下一个视图。
这是一段代码摘录:
- (void)toggleView
{
NSArray* views = [splitView subviews];
long count = [views count];
// toggle last subview's contents (either rightmost or bottommost)
NSView* currentContentView = [views objectAtIndex:(count - 1)];
[nextContentView setFrame:[currentContentView frame]];
NSView* temp = currentContentView;
[splitView replaceSubview:currentContentView with:nextContentView];
nextContentView = temp;
}
在第一次调用nextContentView之前,您需要先初始化nextContentView。我在-applicationDidFinishLaunching中将IB中创建的视图中的参考出口分配给它。