8

だから私はココアの使い方を学び始めています。私はほとんどそれを持っていると思いますが、ビューの作成と切り替えに夢中になっています。少し前に作ったゲームを練習用に書き直しています。必要なのは1つのウィンドウ(できればサイズ変更不可)だけで、ゲーム内のさまざまな画面のビューを切り替えられるようにしたいです。

まず、メインメニュー(ゲームの開始、ハイスコア、終了)があります。次に、各画面(ゲームプレイ画面、ハイスコア画面)用のウィンドウが必要です。

私が混乱しているのは、これをどのように設計するかです。ビューを管理していると思ってNSViewControllerを調べましたが、そうではありません。実際にロードすることで、1つのビューのみを管理します。なぜNSViewControllerを使用する必要があるのか​​わかりません。NSViewの複数のサブクラスを含むウィンドウクラスを作成して、そのようにロードすることはできませんか?ViewControllerの目的がわかりません。

私のウィンドウクラスは本当にNSWindowControllerをサブクラス化する必要がありますか?私はAppleのViewControllerの例に従おうとしていましたが、NSWindowControllerのサブクラスであるウィンドウコントローラークラスがあります。それをサブクラス化する目的が何だったのかわかりません。NSWindowControllerはすべて追加されているよう- initWithPath:(NSString *)newPathに見えますが、起動時にplistファイルを編集してウィンドウを開くことができる場合でも、その使用法はわかりません。Appleの例には、NSView変数とNSViewController変数もあります。現在のビューを格納するために必要な変数は1つだけではありませんか?

事前のおかげで、私はこれがどのように機能するかについて本当に混乱しています。

4

4 に答える 4

6

ウィンドウ内のコンテンツ ビューを入れ替えようとしているようですね。その場合は、受信機として-[NSView replaceSubview:with:]使用できます。-[NSWindow contentView]

という名前のタイトル ページと という名前titleViewのメニュー ページがmenuViewあり、これらをアプリケーションのメイン ウィンドウの内外で入れ替えたいとします。タイトル ページが表示されていて、ユーザーが「メイン メニュー」ボタンまたはリンクをクリックした場合、ボタンのデリゲート メソッドに次のようなものを配置します。

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];

次の 2 つの点に注意してください。

  1. この場合、古いビューtitleViewはこの呼び出しによって解放されます。引き続き利用したい場合は、retain交換する前にそれを入手する必要があります。
  2. ページのサイズが異なる場合、親ビューのサイズは変更されません。ウィンドウのフレーム サイズを変更するのcontentViewは簡単ですが、少しコア アニメーションをミックスに追加してスタイルを与えることもできます。

これが役立つことを願っています!

于 2010-07-18T11:43:49.577 に答える
5

ウィンドウまたはビューの新しい「種類」のサブクラスを作成するだけでよいため、ウィンドウまたはビューを管理するためNSWindowControllerに andを使用します。たとえば、円形のウィンドウを使用する場合は、 をサブクラス化します。ウィンドウにコントロールが必要なだけの場合は、 をサブクラス化します。NSViewControllerNSWindowNSViewNSWindowNSWindowController

と同じNSViewControllerです。通常、NSViewController'sビューは次のような基本クラスになりNSViewます(またはNSView、カスタム背景を描画する独自のサブクラス)。はNSViewController、そのビューのサブビュー間の相互作用を管理し、より大きなアプリケーション内で単一のユニットとして機能できるようにします。

次のように考えてみてください。ビューは描画し、生の入力イベントをより高いレベルのアクションに変換します。コントローラーはビューに情報を提供し、アクションを処理します。

このように構成すると、コードのモジュール性が大幅に向上し、設計、記述、およびデバッグが容易になります。

于 2010-07-17T19:54:46.853 に答える
1

UIVew で定義されている次の関数を使用します (既存のウィンドウの一部です)。

- (void)addSubview:(UIView *)view
- (void)removeFromSuperview
于 2010-07-17T18:34:02.257 に答える
0

私はココアが初めてですが、あなたのアプリは実際には NSViewController を必要としないと思います。NSViewController は、MVC デザイン パターンで「コントローラー」の役割を果たします。したがって、すべてのアクション (グルー ロジック) を 1 つのビュー内で「制御」します。

たとえば、ボタン、テーブル、チェックボックス、テキストフィールドの日付ピッカーなど、複数のコントロールを含むビューでは、バインディングと更新を必要とするこれらのコントロール間の詳細な相互作用が発生する可能性があります。たとえば、ボタンをクリックすると、データベース フェッチが読み込まれ、エラー処理と検証が行われます。そのグルー ロジックは NSViewController クラスに入ります。

あなたのアプリでは、各ビューは、ビュー レベルの制御をほとんど必要としない単純なページのように見えます。そのため、おそらく単一の NSWindowController が必要です。これは、ページからページへ遷移するためのロジックとイベントを処理するためのコントローラーです。

単一のウィンドウを埋める複数のビューを処理する 1 つの手法は、NSTabView を使用し、IB でタブ スタイルを「borderless」に設定することです。次に、ボタン アクションを使用して、必要な NSTabViewItem を選択します。開発中に、タブビュー スタイルを「トップ タブ」に設定すると、IB により、表示するサブビューをタブで移動できます。

于 2013-10-31T15:51:43.743 に答える