我在用Interface Builder和NSViewController加载 View 时全神贯注。

我的目标是拥有一个满足以下描述的 View :顶部的顶部栏(类似于工具栏,但不完全相同)跨越 View 的整个宽度,下面是第二个“内容 View ”。该复合 View 归我的NSViewController子类所有。

为此,可以使用Interface Builder。我创建了一个 View 笔尖,并向其中添加了两个 subview ,将它们正确布置(带有顶部栏和内容 View )。我已将File's Owner设置为MyViewController,并连接了插座等。

我希望加载的 View (栏和内容)也位于它们自己的笔尖中(这可能是让我烦恼的原因),并且那些笔尖将“自定义类”设置为相应的NSView子类(如果适用)。我不确定要设置什么作为File's Owner(我猜MyController应该是其所有者)。

las,当我初始化MyViewController实例时,我的笔尖实际上都没有显示。我已经将它正确地添加到了Window的contentView中(否则,我已经检查过了),实际上,这有点麻烦。也就是说,awakeFromNib被发送到条形 View ,但是它不显示在窗口中。我想我肯定在某处有一些电线交叉。也许有人可以伸出援手减轻我的一些挫败感?

编辑一些代码以显示我在做什么

当我的应用程序完成启动时,将从应用程序委托(delegate)中加载 Controller :

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

然后在我的initWithNibName中,除了现在调用super,我什么都没做。

最佳答案

将每个 View 分解为自己的笔尖并使用NSViewController时,处理事物的典型方法是为每个笔尖创建NSViewController子类。然后将每个相应笔尖文件的文件所有者设置为该NSViewController子类,然后将view导出连接到笔尖中的自定义 View 。然后,在控制主窗口内容 View 的 View Controller 中,实例化每个NSViewController子类的实例,然后将该 Controller 的 View 添加到窗口中。

简短的代码-在此代码中,我将主内容 View Controller 称为MainViewController,“工具栏”的 Controller 为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

关于cocoa - NSViewController和Nib的多个 subview ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1726250/

10-13 03:04