Динамическая загрузка части окна в Cocoa

У меня есть область окна (в моем MainMenu.xib), которую я хотел бы динамически заполнять несвязанными «представлениями», такими как NSTable, IKImageBrowserView и т. д., в разные моменты времени в зависимости от некоторых выбранных пользователем критериев.

  • Как определить эту область окна, чтобы ее можно было «заменить» другими представлениями?
  • Как мне прикрепить таблицу или другой вид к этой области окна?

(Достаточно ли разместить там общий NSView и каждый раз добавлять подпредставление? Я новичок в Cocoa, поэтому приветствуются любые указатели)


person Debajit    schedule 01.07.2009    source источник


Ответы (3)


В современном Cocoa это работа контроллеров представления. Кэти Шайв написала о них несколько хороших сообщений в блоге (1, 2, 3) , а также стал соавтором более полезного класса контроллера представления, чем базовый NSViewController.

person Peter Hosey    schedule 01.07.2009

Есть несколько способов сделать это. Я считаю, что легко добавить «пользовательский nsview» и заменить его реальным представлением в windowDidLoad. Это будет выглядеть примерно так:

@interface MyController : NSWindowController
{
    IBOutlet NSView* dummyView;
}
@end

@implementation MyController
-(void)windowDidLoad{
    NSView* actualView = ...; //create the real view here
    [actualView setFrame:[dummyView frame]];
    [actualView setAutoresizingMask:[dummyView autoresizingMask]];

    NSView* superview = [dummyView superview];
    [dummyView removeFromSuperview];
    [superview addSubview:actualView];

    dummyView = actualView; //just incase dummyView is ever used again
}
@end
person Tom Dalling    schedule 01.07.2009

Лично я бы добавил 2 представления для раздела 2. Скажем, topView и bottomView связывают их с вашим кодом, используя ссылку в построителе интерфейса. Оттуда вы можете управлять содержимым каждого представления с помощью:

addSubview (это функция объекта, которая получит uiview или объект)

вы можете использовать это, чтобы добавить отдельные объекты или представления к вашим двум основным представлениям, например:

[topView addSubview:roundedUIButton_instance];

OR

[topView addSubview:another_view_instance];

removeFromSuperview (функция объекта, используемая для удаления самого себя)

[roundedUIButton_instance removeFromSuperview];

OR

[another_view_instance removeFromSuperview];
person abe    schedule 01.07.2009