2009-11-12 4 views
25

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

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

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

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

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

EDIT некоторый код, чтобы показать, что я делаю

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

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

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

+0

Отправьте свой код. Непонятно, как вы инициализируете свой контроллер представлений. –

ответ

71

При разбиении каждого вида на его собственный наконечник и использовании 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 
+0

Работает как очарование. Спасибо как за пример, так и за подробное объяснение! – jbrennan

+0

Спасибо, это было очень полезно. ++ – ttvd

2

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

+1

Не нужно. На мой взгляд, даже хорошая практика заключается в том, чтобы отделить контроллер окна от контроллера представления, который управляет представлением содержимого всего окна. Окно имеет гораздо больше деталей и функциональных возможностей, чем представление (с соответствующим контроллером представления). –

 Смежные вопросы

  • Нет связанных вопросов^_^