9

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

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

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

4

4 回答 4

5

在您的右侧窗格中,您NSSplitView可以放置​​一个无标签的NSTabView. 视图的每个选项卡都可以包含您要显示的视图之一。然后,在大纲视图的委托中,只要求选项卡视图在选择特定项目时显示适当的视图。

于 2011-07-05T13:35:50.313 回答
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 view] 以获取放置到 NSSplitView 右侧的视图。

于 2011-07-06T00:20:30.737 回答
1

如果您有对将“更改”的视图的引用,您可以在某些 delgate 方法中添加一个新视图作为它的子视图。

于 2011-07-05T13:38:03.120 回答
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。我在 -applicationDidFinishLaunching 中将 IB 中创建的视图中的参考出口分配给它。

于 2012-09-08T20:42:46.243 回答