gpt4 book ai didi

cocoa - NSViewController 和 Nib 中的多个 subview

转载 作者:行者123 更新时间:2023-12-03 16:01:19 27 4
gpt4 key购买 nike

我很难理解如何使用 Interface Builder 和 NSViewController 加载 View 。

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

为此使用 Interface Builder 是有意义的。我创建了一个 View Nib ,并向其中添加了两个 subview ,并正确放置了它们(带有顶部栏和内容 View )。我已将 File's Owner 设置为 MyViewController,并连接了 socket 等。

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

唉,当我初始化 MyViewController 的实例时,我的 Nib 实际上都没有显示。我已经将它正确添加到我的 Window 的 contentView 中(我已经检查过其他情况),实际上,事情已经加载了。也就是说,awakeFromNib 被发送到栏 View ,但它不会显示在窗口中。我想我肯定在某个地方交叉了一些电线。也许有人可以伸出援手来缓解我的一些挫败感?

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

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

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

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

最佳答案

将每个 View 分解为自己的 Nib 并使用 NSViewController 时,典型的处理方法是为每个 Nib 创建一个 NSViewController 子类。然后,每个相应 nib 文件的文件所有者将设置为该 NSViewController 子类,并且您将 view 导出连接到 nib 中的自定义 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com