1

青色のオブジェクト ボックスを使用して、NSOutlineView の制御を委任できるようにしたいと考えています。青色のオブジェクト ボックスはプライマリ コントローラーに接続されるため、単なるデータ ソースとなり、NSOutlineView のコンテンツを制御します。

私が抱えている問題は、Channel Data Source を制御できないことです。内部にいくつかのテスト NSLog を含む宣言されたメソッドを呼び出しているだけで、呼び出されません。アウトレットはインスタンス化されません。

青いオブジェクト ボックス (ChannelDataSource) の接続は次のとおりです。

ここに画像の説明を入力

これが、プライマリ コントローラのファイルの所有者の接続です。

ここに画像の説明を入力

[dataSource callMyMethod];ほら、最終的な目的で、コンテンツを制御できるようなことをしたいのNSOutlineViewです。

何か案は?

編集

アプリケーションは、主にアプリのデリゲートが次のようになるように構成されています。

@implementation MyAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    controller = [[MainController alloc] init];
    [controller showWindow];
}

@end

次にMainController、次の行に沿って何かがあります。

@implementation MainController

-(id)init {
    self = [super init];
    if (self) {
        // loads of random stuff

        [dataSource myMethod];
    }

    return self;
}

「Channel Data Source」の青いオブジェクトボックスはdataSource. アプリケーション ライフ サイクルのこの時点では、これは null であり、これは私が期待していたものではありません。同時に、それは私にとってまだちょっとした黒魔術でもあります。青いオブジェクト ボックスがある場合、それはどの時点でインスタンス化されますか? 明らかに、これは正しく接続されていません。

編集 編集

上記の私のポイントに加えて、問題を解決しようとしていますが、これは実際にそれを行う良い方法ですか? 最終的に青いオブジェクトボックスの所有クラスがデータを保存および管理しているため、適切なMVCアーキテクチャを満たしていないと考えてこれを見ています。NSOutlineView の内容を管理するためのより良い方法はありますか?

編集 編集 編集

これは奇妙なことに、それ自体がメイン コントローラーをインスタンス化するクラスです。なぜこれを行ったのか聞かないでください。これは非常に初期のコードでした。したがって、私のアプリ デリゲート (ルート エントリ ポイント) には次のようなものがあります。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    controller = [[MyController alloc] initWithWindowNibName:@"MainWindow"];
    [controller showWindow:nil]; // this doesn't open the window
    [controller loadWindow]; // this does open the window
}

そしてコントローラの宣言:

@interface MyController : NSWindowController

次のメソッド宣言が含まれています。

-(void)windowDidLoad {
    [dataSource insertChannel:@"test" forServer:@"test2"];
}

私はブレークポイントを持っていますがwindowDidLoad、それは間違いなく呼び出されません。

アイデア?

4

1 に答える 1

0

あなたが明確にしなかったことがまだいくつかありますが、私はいくつかの推測をすることができます。まず、MainControllerはNSWindowControllerのサブクラスであると想定しています。その場合は、単にinitの代わりにinitWithWindowNibName:を使用する必要があります。そうしないと、showWindow:をアドレス指定したときに、コントローラーはどのウィンドウを表示するかをどのように知ることができますか?次に、それを実行し、initメソッドをinitWithWindowNibNamed:に変更しても、initはプロセスの初期段階でアウトレット、データソースを表示できないため、書き込んだ内容は機能しません。dataSourceをログに記録するだけでは、nullになります。それまでにすべてがセットアップされているので、そのコードを配置するのに適した場所はwindowDidLoadです(これはshowWindow:の後に呼び出されます)。だから、私の小さなテストプロジェクトでは、これが私がしたことです。

アプリデリゲート:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.cont = [[Controller alloc] initWithWindowNibName:@"Window"];
    [self.cont showWindow:nil];
}

Controller.MIには次のものがあります。

- (void)windowDidLoad {
    NSLog(@"%@",self.dataSource);
    [self.dataSource testMethod];
}

IBのWindow.xibファイルで、ファイルの所有者のクラスをControllerに設定し、青い立方体のクラスをChannelDataSourceに設定しました。EVerythingは、投稿で示したのと同じ方法で接続されました。

于 2012-09-13T15:51:24.260 に答える