Динамическое изменение содержимого представления в NSSplitView? - PullRequest
9 голосов
/ 05 июля 2011

У меня есть приложение, которое имеет макет, похожий на iTunes. Главное окно - это NSSplitView.

В зависимости от того, что пользователь выбирает в левом столбце, мне нужно показать другое представление. Например, в itunes, если вы нажимаете «Музыка», вы видите список песен в таблице, если вы нажимаете «ТВ-шоу», я вижу белый экран с текстом на нем.

Если бы вы пытались решить эту проблему целую вечность, любые указатели в правильном направлении были бы очень полезны!

Ответы [ 4 ]

5 голосов
/ 05 июля 2011

На правой панели вашего NSSplitView вы можете разместить NSTabView без вкладок.Каждая вкладка представления может содержать одно из представлений, которые вы хотите отобразить.Затем в представителе вашего контурного представления просто попросите представление вкладок отобразить соответствующее представление, когда выбран конкретный элемент.

2 голосов
/ 06 июля 2011

Это действительно работа для NSViewController.Это означает, что вы можете поместить каждое представление в отдельный файл пера, а затем при необходимости поменять их местами.Когда вам нужно поменять местами представления, вы можете сделать что-то вроде этого (при условии, что у вас есть NSBox в правой панели NSSplitView)

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.

1 голос
/ 09 сентября 2012

Я нашел другое решение после того, как попробовал все виды вещей, которые не работали.Метод -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 перед первым вызовом.Я назначаю ему ссылку-представление из представления, созданного в IB, в -applicationDidFinishLaunching.

1 голос
/ 05 июля 2011

Если у вас есть ссылка на представление, которое «изменится», вы можете в некотором методе delgate добавить новое представление в качестве его подпредставления.

...