NSViewController и несколько подпредставлений из пера - PullRequest
25 голосов
/ 13 ноября 2009

У меня возникают трудности с загрузкой представлений с помощью Interface Builder и NSViewController.

Моя цель состоит в том, чтобы иметь представление, которое соответствует следующему описанию: верхняя панель сверху (как панель инструментов, но не совсем), которая охватывает всю ширину представления, и второй «вид содержимого» ниже. Этот составной вид принадлежит моему NSViewController подклассу.

Для этого имело смысл использовать Interface Builder. Я создал перо представления и добавил к нему два подпредставления, выложив их правильно (с верхней панелью и представлением содержимого). Я установил File's Owner на MyViewController, подключил розетки и прочее.

Представления, в которые я хочу загрузить (панель и содержимое), также находятся в их собственных перьях (это может быть тем, что сбивает меня с толку), и эти перья имеют свой собственный класс, установленный на соответствующий подкласс NSView, где это применимо. Я не уверен, что установить в качестве их File's Owner (я предполагаю, что MyController должен быть их владельцем).

Увы, когда я запускаю экземпляр MyViewController, ни одно из моих перьев на самом деле не отображается. Я добавил его в contentView моего окна правильно (я проверял иначе), и на самом деле, вещи вроде загружаются. То есть awakeFromNib отправляется на панель, но не отображается в окне. Я думаю, что я определенно где-то пересек провода. Возможно, кто-то мог бы помочь, чтобы снять мое разочарование?

РЕДАКТИРОВАТЬ некоторый код, чтобы показать, что я делаю

Контроллер загружается после завершения запуска моего приложения из делегата приложения:

MyController *controller = [[MyController alloc] initWithNibName:@"MyController" bundle:nil];
[window setContentView:[controller view]];

А потом в моем initWithNibName я ничего не делаю, но пока что звоню супер.

Ответы [ 2 ]

71 голосов
/ 13 ноября 2009

Когда вы разбиваете каждое представление на свое собственное перо и используете NSViewController, типичным способом обработки вещей является создание подкласса NSViewController для каждого из ваших перьев. Владелец файла для каждого соответствующего файла пера затем будет установлен на этот подкласс NSViewController, и вы подключите выход view к своему пользовательскому представлению в наконечнике. Затем в контроллере представления, который управляет представлением содержимого главного окна, вы создаете экземпляр каждого подкласса NSViewController, а затем добавляете представление этого контроллера в свое окно.

Небольшой фрагмент кода - в этом коде я вызываю основной контроллер представления контента MainViewController, контроллер для "панели инструментов" - TopViewController, а остальное содержимое - ContentViewController

//MainViewController.h
@interface MainViewController : NSViewController
{
    //These would just be custom views included in the main nib file that serve
    //as placeholders for where to insert the views coming from other nibs
    IBOutlet NSView* topView;
    IBOutlet NSView* contentView;
    TopViewController* topViewController;
    ContentViewController* contentViewController;
}

@end

//MainViewController.m
@implementation MainViewController

//loadView is declared in NSViewController, but awakeFromNib would work also
//this is preferred to doing things in initWithNibName:bundle: because
//views are loaded lazily, so you don't need to go loading the other nibs
//until your own nib has actually been loaded.
- (void)loadView
{
    [super loadView];
    topViewController = [[TopViewController alloc] initWithNibName:@"TopView" bundle:nil];
    [[topViewController view] setFrame:[topView frame]];
    [[self view] replaceSubview:topView with:[topViewController view]];
    contentViewController = [[ContentViewController alloc] initWithNibName:@"ContentView" bundle:nil];
    [[contentViewController view] setFrame:[contentView frame]];
    [[self view] replaceSubview:contentView with:[contentViewController view]];
}

@end
2 голосов
/ 22 июля 2010

Разве MainViewController не должен быть подклассом NSWindowController? А выходы в классе подключены для просмотра элементов в главном окне в MainMenu.xib? Будем надеяться, что старые темы все еще читаются ...

...