【问题标题】:NSViewController and multiple subviews from a NibNSViewController 和来自 Nib 的多个子视图
【发布时间】:2010-12-16 02:58:03
【问题描述】:

我很难集中精力使用 Interface Builder 和 NSViewController 加载视图。

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

为此使用 Interface Builder 是有意义的。我创建了一个视图笔尖,并向其中添加了两个子视图,将它们正确布局(使用顶部栏和内容视图)。我已将File's Owner 设置为MyViewController,并连接了插座等。

我希望加载的视图(栏和内容)也在它们自己的 nib 中(这可能是让我绊倒的原因),并且这些 nib 将它们的自定义类设置为相应的 NSView 子类(如果适用)。我不确定将什么设置为他们的File's Owner(我猜MyController 应该是他们的所有者)。

唉,当我初始化 MyViewController 的实例时,我的笔尖实际上都没有显示。我已经将它正确地添加到我的窗口的 contentView 中(我已经检查过),实际上,事情有点加载。也就是说,awakeFromNib 被发送到条形视图,但它不会显示在窗口中。我想我肯定有一些电线交叉在某个地方。也许有人可以帮我减轻一些挫败感?

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

当我的应用程序完成启动时,从应用程序委托加载控制器:

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

然后在我的 initWithNibName 中,我现在什么也不做,只是调用 super。

【问题讨论】:

  • 发布您的代码。目前尚不清楚您是如何初始化视图控制器的。

标签: cocoa interface-builder nib nsviewcontroller


【解决方案1】:

当将每个视图分解为自己的 nib 并使用 NSViewController 时,处理事情的典型方法是为每个 nib 创建一个 NSViewController 子类。然后,每个 nib 文件的 File's Owner 将设置为 NSViewController 子类,您可以将 view 插座连接到 nib 中的自定义视图。然后,在控制主窗口内容视图的视图控制器中,实例化每个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 中主窗口中的视图元素? 让我们希望旧线程仍然被阅读......

【讨论】:

  • 没必要。在我看来,将窗口控制器与管理整个窗口的内容视图的视图控制器分开是一种很好的做法。窗口比视图(具有相应的视图控制器)具有更多的部分和功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多