スライダーやボタンなどのコントロールを含み、色付きの背景を持つビューが必要です。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 ファイルで定義されたビューを統合するという目的には十分に役立ちます。