2

シングル ドキュメント インターフェイス (SDI) ドキュメント ベースのココア アプリケーションを作成する方法はありますか? ユーザーに複数のドキュメントを一度に開いてほしくありません。

4

2 に答える 2

3

あなたはこれを行うことができます、それはそれほど悪くはありません.

一般的なアプローチ: アプリの xib であるシングルトン NSWindowController にアタッチする必要がある NSDocument を使用します。ドキュメントが開いていないときに、そのウィンドウに他のものを表示することもできます。このデザインは、NSDocument のすべての機能を活用したままにしておくなど、私にとってはうまく機能します...

ここにいくつかの詳細があります:


他のウィンドウを削除します

新しいウィンドウを使用するため、Xcode によって作成されたアプリ テンプレートでデフォルトになっている可能性があるものをすべて削除します。おそらく MainMenu.xib で、それをすべて取り除くか、新しい xib に移動します。

将来の NSWindowController 用に新しい xib (ウィンドウ) を作成します

テスト用のプレースホルダーを作成するだけです。後でさらに追加します (ユーザーが常に表示するメイン ウィンドウであるため)。

独自の NSWindowController を作成し、シングルトンにします

したがって、NSWindowController 内で、xib を (1 回だけ) ロードするシングルトン ラッパーを作成し、呼び出されるたびにこの単一のシングルトンを返します。ヘルパー #define を使用しました。詳細については、こちらをご覧ください: https://gist.github.com/1057420

+ (id) singletonInstance {
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
        return [[self alloc] initWithWindowNibName:@"yourxibfilename"];
    });
}

このシングルトン ウィンドウのみにアタッチするように NSDocument を変更します。

このようなものを NSDocument ベースのドキュメントに追加します。基本的に、あなたが持っているシングルトン ウィンドウを使用するように Document に指示し、NSWindowController 内の内部 setDocument を自動的に呼び出して、表示されている既存の NSDocument を置き換える必要があります。

- (void)makeWindowControllers {
    ReceiptDocumentWindowController *wc = [ReceiptDocumentWindowController singletonInstance];
    [self addWindowController:wc];
}

終了時に NSWindowController から NSDocument を削除することを検討してください。場合によってはこれが必要だとは思いませんが、これについても調査することができます。したがって、NSDocument ドキュメント内でも次のようになります。

- (void)close {
    [self removeWindowController:[ReceiptDocumentWindowController singletonInstance]];
    [super close];
}

テスト - プロトタイプ ソリューションが動作するはずです。

それにはいくつかの問題があり、それらはすべて正確な要件に依存します。

まず、独自の NSDocumentController を使用して、開いているドキュメントを新しいドキュメントを開く前に自動的に閉じることを検討してください。これについてはもっと研究する必要があります。

私が言及したその NSViewController に戻り、「現在開いているドキュメント」で更新する方法。NSWindowController に setDocument に接着剤を入れて、下流の IBOutlet に接続された xib インスタンス (この NSViewController など) に開くドキュメントを添付します。わかりました、このように:

- (void)setDocument:(NSDocument *)lDocument {
    [super setDocument:lDocument];
    if (lDocument != nil && self.receiptDetailViewController != nil)
        self.receiptDetailViewController.representedObject = lDocument;
}

これで、私の NSDocumentViewController で表されたオブジェクトには、cocoa バインディングを使用して NSViewController.representedObject にバインドするビューがあります。だから、ビンゴ、それは私のものをほとんど魔法のようにレンダリングします. このようにカプセル化することをお勧めします。そうすれば、xib 内のビューを使用してドキュメントを表示することに集中できます。NSViewController は、開かれたドキュメントへの参照を持っています。

これが十分に明確でない場合は、お知らせください。さらにコードを投稿します。頑張ってください。これが役立つかどうか教えてください。

マーカス・ウィリフォード

于 2012-09-10T08:07:53.230 に答える
0

Cocoa アプリケーション テンプレートに基づいて新しい Xcode プロジェクトを作成することで、必要な UI を取得できるはずです。[Create Document-Based Application] のチェックを外してください。

開く/保存するコマンドを自分で作成し、クラスを変更するNSDocument必要がありますが、それは実行可能なはずです。

于 2012-02-19T15:44:17.543 に答える