2

スライダーやボタンなどのコントロールを含み、背景が色付きのビューが必要です。サブクラスにするNSViewNSViewController。をサブクラス化しNSViewてカスタム背景を描画し、コントロールをxibにレイアウトして、アウトレットをNSViewサブクラスに設定できると思いました。

一部のボタンは切り替える必要があります。たとえば、再生/一時停止ボタンなどです。このロジックはで実行する必要があり、ボタンを自分で管理するのではなく、ボタンが切り替わったときに通知NSViewを受ける必要があると思いました。NSViewControllerNSViewController

しかし、NSViewサブクラスを作成しようとすると、を作成するオプションxibがグレー表示され、それは。でのみ可能になりますNSViewController。だから私はコンセントを持っている必要がありNSViewControllerますか?

欲しかっmyView.playPauseButtonたのですが、やらなきゃいけないみたいmyViewController.playPauseButton

4

2 に答える 2

3

スライダーやボタンなどのコントロールを含み、色付きの背景を持つビューが必要です。NSView と NSViewController のどちらをサブクラス化するかがわかりません。NSView をサブクラス化し、カスタム背景を描画し、コントロールを xib にレイアウトし、アウトレットを NSView サブクラスに設定できると考えました。

xib を使用する場合は、NSViewControllerサブクラスを使用する必要があります。とりわけ、それがその目的です。

一般に、何をしようとしているのか (複数のコントロールをまとめること)NSViewControllerは、使用するクラスです。

これは、モデル - ビュー - コントローラー パターン (ビュー コントローラーとビューの由来) の観点からも見ることができます。コントローラーは、ユーザーの操作 (およびモデルとの操作) を処理する必要があります。

確かに、NSViewサブクラスを定義し、そのコンテンツをプログラムまたは IB で定義できます (スライダーとボタンをサブビューとして追加します)。コントロール。

編集:

NSViewの中で IB 定義のカスタムを使用したいことをコメントで述べますNSSplitView。これにより、物事がもう少し文脈化されます。

さて、いつものように多くの設計オプションがあります。たとえば、独自のオプションを定義MySplitControllerして、分割ビューのサブビューをロードする nib を指定することができます。

しかし、私があなたの目的を正しく理解していれば、IB が許可するデフォルトのビュー タイプの 1 つであるかのように、xib で NSView を定義し、それを NSSplitView 内で使用したいと考えています。

これはInterface Builder Plug-insによって許可されていました。残念ながら、Xcode 4 ではサポートされていないようです。

NSView次に、たとえば、のサブクラスを定義しMyCustomView、そのinitWithFrame:メソッドで xib ファイルをロードし、その中で定義したビューを識別し、それをサブビューとして追加するという唯一のオプションがあります。

具体的には、このコードを使用して xib ファイルの最上位オブジェクトをロードできます。その中にカスタム ビューが見つかります。

NSNib *nib = [[[NSNib alloc] initWithNibNamed:@"MyView" bundle:nil] autorelease];
NSArray *topLevelObjects;
if (![nib instantiateWithOwner:customViewOwner topLevelObjects:&topLevelObjects]) {
    //- handle error
}

MyView *myView = nil;
for (id topLevelObject in topLevelObjects) {
  if ([topLevelObject isKindOfClass:[MyView class]) {
    myView = topLevelObject;
    break;
  }
}

簡単にするために、この xib ファイルでカスタム NSView とユビキタスなファイルの所有者 (ビューをアプリの残りの部分に統合するためのリンク) のみを定義することができます。

customViewOwnerご覧のとおり、 toを渡していinstantiateWithOwnerます。これは、カスタム ビューからのすべてのアクションに応答し、必要に応じてその状態を設定するためのメイン ビュー コントローラーまたはアプリ デリゲートになります。このクラスは xib のファイル所有者になるため、実際にモジュール設計を行うにはMyCustomViewController、特定のプロジェクトでサブクラス化することを定義することをお勧めします。

このようなカスタム NSView サブクラスを定義したら、それを NSSplitView に統合するために必要なことは、NSSplitView のサブビュー クラスを に設定することだけですMyCustomView

これは IB プラグインを使用するほど簡単ではありませんが、異なる xib ファイルで定義されたビューを統合するという目的には十分に役立ちます。

于 2012-10-30T18:03:33.080 に答える
-1

NSViewController をサブクラス化し、xib で初期化するか、サブビューをコードで手動でレイアウトするのが最善です。私の経験から、NSView のサブクラス化は、あなたが探している実装を含め、私が望んでいた方法ではうまくいきませんでした。

于 2012-10-30T17:44:21.883 に答える