动态更改NSSplitView中视图的内容?

时间:2011-07-05 13:31:43

标签: objective-c cocoa nssplitview

我的应用程序的布局类似于iTunes。主窗口是NSSplitView。

根据用户在左栏中选择的内容,我需要显示不同的视图。例如,在iTunes中,如果你点击“音乐”,你会看到一个表格中的歌曲列表,如果你点击“电视节目”,我会看到一个带有一些文字的白色屏幕。

多年来一直试图解决这个问题,任何指向正确方向的指针都会非常方便!

4 个答案:

答案 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中创建的视图中的参考出口分配给它。