添加子视图到 NSView 显示,但不能删除

Posted

技术标签:

【中文标题】添加子视图到 NSView 显示,但不能删除【英文标题】:Adding Subviews to NSView show up, but can not be removed 【发布时间】:2012-04-10 04:40:03 【问题描述】:

在我的应用程序窗口中,我有两个 NSView。左侧的 NSView(“菜单”)包含几个按钮。单击其中一个按钮时,它应该更改右侧 NSView(“内容”)的内容。

对于右侧的每个视图,我都有一个单独的 NSViewControllers 被加载,它们的视图被添加为子视图。当在左侧按下另一个按钮时,应删除右侧添加的子视图,并且应将新视图作为子视图加载。

为此,我在 AppDelegate 中加载了我的菜单,其中包含以下内容:

 MenuVC *menuSubView = [[MenuVC alloc] initWithNibName:@"MenuVC" bundle: nil];
    menuSubView.contentView = (NSView*)[self contentView];
    [[self menuView] addSubview:[menuSubView view]];

这很好用。如您所见,我在 Menu VC 中有一个 NSView 指针,它指向 contentView,以便我可以使用子视图填充它。

现在,作为一种按下按钮的方法,我执行以下操作:

SomeContentVC *subView = [[SomeContentVC alloc] initWithNibName:@"SomeContentVC" bundle:nil];
    [self.contentView addSubview:[subView view]];

这不起作用。

但是,如果我从 MenuViewController 实现的 awakeFromNib 方法添加子视图(在应用程序打开时默认内容的情况下)它可以工作。但是,当我尝试使用

删除该子视图时
[[self.contentView setSubviews:[NSArray array]];

我不能。有趣的是,如果我尝试计算子视图的数量(即使在 awakeFromNib 方法中添加了一个),它也会为 self.contentView 返回 0 个子视图。为什么?我怎样才能让它正常工作?

谢谢

【问题讨论】:

什么是 self.contentView?据我所知 NSViewController 没有这样的属性,除非你自己创建它。 在 AppDelegate 中,它是一个指向右侧 NSView(我的应用程序的内容部分)的 NSView 指针。在 MenuVC 中,我还有一个 NSView 指针,它在创建时从 AppDelegate 填充,并且我传递 AppDelegate 的指针,以便我可以在主应用程序窗口中填充正确的 NSView。也许这有助于lh5.googleusercontent.com/-rsaZ6LZLeqM/T4PCBu-z43I/AAAAAAAAAAo/… 【参考方案1】:

消息 self.contentView 什么都没有,除了在某些情况下,返回 0 可能意味着 self.contentView 为零。

您是否偶然有两个 MenuVC 实例?也许一个在 NIB 中实例化,一个在代码中实例化?

如有疑问,请记录所有内容。以各种方式记录self。在您创建它之后记录menuSubView。在分配之后记录menuSubView.contentView。等等。最终,您可能会发现您正在与与您想象的不同的对象进行交互。

【讨论】:

就是这样...我在 MenuViewController 的 NIB 中还有一个 NSObject...谢谢!

以上是关于添加子视图到 NSView 显示,但不能删除的主要内容,如果未能解决你的问题,请参考以下文章

将子视图添加到 NSView

将 NSWindow 显示为 NSView 的子视图

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

将子视图添加到 NSView 以获得类似国际象棋的网格

Cocoa NSView 子视图阻止拖放

特立独行的问题:在 NSView 上添加子视图时