最終更新:2013-01-10 (木) 07:06:17 (4117d)  

Cocoa/デリゲート
Top / Cocoa / デリゲート

オブジェクト指向では、ある既存クラスの機能をカスタマイズしたいとき(機能追加など)サブクラスを作成するが、Cocoaでは、デリゲート(委譲)を使用してクラスの機能をカスタマイズ?する

概要

  • デリゲート(delegate, 委譲)とは、あるオブジェクトがプログラム中でイベントに遭遇したとき、それに代わって、または連携して処理するオブジェクトのこと
    • デリゲートは、当該イベントに関してユーザインターフェイスの制御を委ねられる
  • デリゲートとして指定したオブジェクトは主に、AppKitならばNSResponderUIKitならばUIResponderを継承し、ユーザイベントに応答する

仕組み

  • 委譲する側のクラス(デリゲートクラス)には、一般にdelegateという名前の、アウトレットまたはプロパティがあります。アウトレットの場合は、値の設定/取得メソッドもあります。
  • さらに、実装はありませんが、公式(formal)または非公式(informal)のプロトコルを構成するメソッドがいくつか宣言されています。
  • 省略可のメソッドを用いる公式プロトコルObjective-C 2.0の機能)の方を推奨しますが、Cocoaフレームワークではどちらのプロトコルも使われています。

デリゲートメッセージの形式

  • デリゲートメソッドの名前のつけ方には規約があります。
    • メソッド名の先頭は、デリゲートする側の(AppKitまたはUIKitの)オブジェクト
      • アプリケーション、ウインドウ、コントロール部品などの名前
      • すべて小文字にし、接頭辞(「NS」、「UI」)を省いて使う(常にではない)
    • 通常はこの後に、報告されたイベントの時制を表す助動詞(「Should」または「Will」)か(「Did」または「Has」)
      • 戻り値を期待しない(戻り値型がvoid)メッセージにより起動されるデリゲートメソッドも多くの場合、「Did」 や「Will」など、イベントがすでに発生した、あるいは発生しようとしていることを表す字句が含まれる

プロトコル

Cocoa/Application Kit/デリゲート

  • NSAlertDelegate? - NSAlert?
  • NSAnimationDelegate? - NSAnimation
  • NSApplicationDelegate - NSApplication
  • NSBrowserDelegate? - NSBrowser?
  • NSCollectionViewDelegate? - NSCollectionView?
  • NSComboBoxDelegate? - NSComboBox?
  • NSControlTextEditingDelegate? - NSControlTextEditing?
  • NSDatePickerCellDelegate? - NSDatePickerCell?
  • NSDrawerDelegate? - NSDrawer?
  • NSImageDelegate? - NSImage
  • NSLayoutManagerDelegate? - NSLayoutManager?
  • NSMatrixDelegate? - NSMatrix?
  • NSMenuDelegate? - NSMenu?
  • NSOpenSavePanelDelegate? - NSOpenSavePanel?
  • NSOutlineViewDelegate? - NSOutlineView
  • NSPageControllerDelegate? - NSPageController?
  • NSPathCellDelegate? - NSPathCell?
  • NSPathControlDelegate? - NSPathControl?
  • NSPopoverDelegate? - NSPopover?
  • NSRuleEditorDelegate? - NSRuleEditor?
  • NSSharingServiceDelegate? - NSSharingService?
  • NSSharingServicePickerDelegate? - NSSharingServicePicker?
  • NSSoundDelegate? - NSSound?
  • NSSpeechRecognizerDelegate? - NSSpeechRecognizer?
  • NSSpeechSynthesizerDelegate? - NSSpeechSynthesizer
  • NSSplitViewDelegate? - NSSplitView?
  • NSTableViewDelegate? - NSTableView
  • NSTabViewDelegate? - NSTabView?
  • NSTextDelegate? - NSText
  • NSTextFieldDelegate? - NSTextField
  • NSTextStorage? - NSTextStorageDelegate?
  • NSTextViewDelegate? - NSTextView
  • NSTokenFieldCellDelegate? - NSTokenFieldCell?
  • NSTokenFieldDelegate? - NSTokenField?
  • NSToolbarDelegate? - NSToolbar?
  • NSWindowDelegate? - NSWindow

UIKit/デリゲート

Cocoa/Foundation/デリゲート

コードによる接続

デリゲートメッセージの形式

  • デリゲートメソッドの名前のつけ方には規約があります。メソッド名の先頭は、デリゲートする側の(AppKitまたはUIKitの)オブジェクト、すなわち、アプリケーション、ウインドウ、コントロール部品などの名前です。すべて小文字にし、接頭辞(「NS」、「UI」)を省いて使います。(常にではありませんが)通常はこの後に、報告されたイベントの時制を表す助動詞が続きます。言い替えると、イベントが発生しようとしている(「Should」または「Will」)か、すでに発生したところである(「Did」または「Has」)かを表す助動詞です。このように時制を示すことにより、戻り値を期待するメッセージとそれ以外を分類できます。

動作

GUIからメソッドが呼ばれるときはこういうイメージ

 // ターゲットがアクションを実装しているかどうか確認(セレクタの存在確認)
 if ([target respondsToSelector:actioin]) {
    // アクションを呼び出す
     [target performSelector:action withObject:self];
 } 
  • respondsToSelector?で実行時に対応するメソッドが存在するかを確認され、メニューではこの結果でenable/disableが決まる

関連