ビューは、ウインドウ内部領域を構成する最も基本的なオブジェクトです。テキストフィールドや、ボタン、スクロールバーなどは全てビューです。またビューは、階層構造をしており、一つのビューの中に複数のサブビューを持つことができます。例えば、NSBox内に配置されたNSTextFieldは、NSBoxのサブビューです。ウインドウ内の全てのビューを含む、階層のルートにあたるのがNSWindowが持つcontentViewです。
この階層構造の状態は、InterfaceBuilderでも確認できます。
ビューはNSViewクラスによって実装されます。NSViewが持つ主な機能は、ウインドウへの描画とイベントの受信です。NSViewは自身の矩形内にQuartzやOpenGL、その他の描画系APIを使って自由にウインドウ内にグラフィックを描画するための環境を提供します。また、マウス・クリックや、キー入力などのイベントを受信することもできます。
ただし、NSViewが持つ描画内容やイベント処理内容は空っぽです。実際にNSViewを使ってディスプレイへの描画や、マウスのイベントを処理するには、サブクラスを作って幾つかのメソッドをオーバーライドする必要があります。
NSControlはNSViewのサブクラスで、主にセルを管理する機能が追加されています。セルとは、グラフィックの描画とイベントを処理する軽量なオブジェクトのことです。
ビューは、ウインドウ内の描画環境の調整や、イベントの受信を始めとして多くの機能が実装された重量級のオブジェクトです。そのためウインドウ内に多くのビューを配置すると、パフォーマンス的に悪い影響がでます。
そこで、ビューの代わりにセルを使うことによってパフォーマンスを大幅に改善することができます。しかし、セルはそれ単体で使用することはできません。セルはグラフィックの描画はできても描画環境の調整を行いません。また、イベントを処理できてもイベントそのものを受信する能力がないからです。
NSControlはNSCellに対して、調整された描画環境の提供と受信したイベントの中継を行います。
ビューの代わりにセルを使うことで、パフォーマンスの改善を図ることができますが、セルを使うためにはその土台となるビューが必要です。しかし、NSControlは一つのNSCellしか管理しないため、これだとパフォーマンス改善の効果は得られません。
パフォーマンス改善のためには、1つのビューのうえに複数のセルを配置しなければなりません。これを行うのがNSMatrixです。NSMatrixは配置されるセルが同種のもので、縦横にマス目状に並ばなければならないという制約がありますが、複数のセルを管理する機能を持ちます。グルーピングされたラジオボタンなどは、このNSMatrixを使用して実現しています。
また、NSTableViewやNSBrowserなども1つのビュー上に、複数のセルを表示させることでパフォーマンスの改善を図っています。
アプリケーション固有の独自のコントロールを作成する場合、それがウインドウ内に1つしか存在しないものなら、NSViewから直接サブクラスを作るのが楽でしょう。わざわざNSControlやNSCellのサブクラスを作る必要はありません。
また、NSTableやNSMatrixなどのセルは、NSCellからサブクラスを作ります。
NSControlからサブクラスを作るケースは、第三者にフレームワークとして提供する以外ほとんどないと思われます。
つぎのページからは、NSView、NSControl、NSCellそれぞれをベースとして独自のコントロールを作成する方法を紹介します。