在Cocoa中动态加载Window的一部分

时间:2009-07-01 07:19:21

标签: objective-c cocoa interface-builder nsview

我有一个Window区域(在我的MainMenu.xib中),我希望在不同的时间点根据一些用户选择的标准动态填充不相关的“视图”,例如NSTable,IKImageBrowserView等。

  • 如何定义窗口的这个区域,以便可以用不同的视图“替换”它?
  • 如何将表格或其他视图附加到窗口的这个区域?

(在那里放置一个通用的NSView并且每次都添加一个子视图就足够了吗?我对Cocoa很新,所以欢迎任何指针)

3 个答案:

答案 0 :(得分:6)

在现代Cocoa中,这是视图控制器的工作。 Cathy Shive有一些关于它们的好博文(123),以及与基本NSViewController共同创作的a more useful view controller class

答案 1 :(得分:1)

有几种方法可以做到这一点。我发现很容易放入“自定义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

答案 2 :(得分:0)

我个人会为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];