将子视图添加到NSView会显示,但无法删除

时间:2012-04-10 04:40:03

标签: objective-c cocoa nsview addsubview nsviewcontroller

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

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

为了实现这一点,我使用以下内容在AppDelegate中加载我的菜单:

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

这很好用。正如您所看到的,我在菜单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个子视图。为什么?我怎样才能让它正常工作?

由于

1 个答案:

答案 0 :(得分:1)

事实上,self.contentView消息传递什么都没有,除了某些东西,返回0可能意味着self.contentView是零。

你是偶然发现了两个MenuVC的例子吗?也许一个在NIB中实例化,一个在代码中实例化?

如有疑问,请记录所有内容。以各种方法记录self。创建后立即记录menuSubView。分配后立即记录menuSubView.contentView。等等。最终,你可能会发现你正在与不同的对象进行交互,而不是你想象的那样。