0

アプリケーションウィンドウには、2つのNSViewがあります。左側のNSView(「メニュー」)にはいくつかのボタンがあります。ボタンの1つをクリックすると、右側のNSViewのコンテンツ(「コンテンツ」)が変更されます。

右側のビューごとに、個別のNSViewControllerが読み込まれ、それらのビューがサブビューとして追加されます。左側でさらにボタンを押すと、右側に追加されたサブビューが削除され、新しいビューがサブビューとしてロードされます。

これを実現するために、次のように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個のサブビューが返されることです。なんで?どうすれば正しく動作させることができますか?

ありがとう

4

1 に答える 1

1

メッセージングself.contentViewが何も達成しないという事実は、いくつかのことを除いて、おそらくself.contentViewがnilであることを意味します。

偶然にMenuVCのインスタンスが2つある可能性がありますか?おそらく、1つはNIBでインスタンス化され、もう1つはコードでインスタンス化されますか?

疑わしい場合は、すべてをログに記録してください。さまざまな方法でログインselfします。menuSubView作成した直後にログに記録します。menuSubView.contentView割り当てた直後にログに記録します。など最終的には、思っていたものとは異なるオブジェクトを操作していることがわかるでしょう。

于 2012-04-10T05:46:15.543 に答える