Подтвердить что ты не робот

NSViewController и несколько подзонов от Nib

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

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

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

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

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

ИЗМЕНИТЬ некоторый код, чтобы показать, что я делаю

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

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

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

4b9b3361

Ответ 1

При разбиении каждого представления на свой собственный наконечник и использовании NSViewController типичным способом обработки вещей является создание подкласса NSViewController для каждого из ваших перьев. Владелец файла для каждого соответствующего файла nib затем будет установлен в этот подкласс 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

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