最終更新:2013-01-10 (木) 07:06:17 (4304d)
Cocoa/デリゲート
オブジェクト指向では、ある既存クラスの機能をカスタマイズしたいとき(機能追加など)サブクラスを作成するが、Cocoaでは、デリゲート(委譲)を使用してクラスの機能をカスタマイズ?する
- デリゲートの設定はInterface Builderで行う。
概要
- デリゲート(delegate, 委譲)とは、あるオブジェクトがプログラム中でイベントに遭遇したとき、それに代わって、または連携して処理するオブジェクトのこと
- デリゲートは、当該イベントに関してユーザインターフェイスの制御を委ねられる
- デリゲートとして指定したオブジェクトは主に、AppKitならばNSResponder、UIKitならばUIResponderを継承し、ユーザイベントに応答する
仕組み
- 委譲する側のクラス(デリゲートクラス)には、一般にdelegateという名前の、アウトレットまたはプロパティがあります。アウトレットの場合は、値の設定/取得メソッドもあります。
- さらに、実装はありませんが、公式(formal)または非公式(informal)のプロトコルを構成するメソッドがいくつか宣言されています。
- 省略可のメソッドを用いる公式プロトコル(Objective-C 2.0の機能)の方を推奨しますが、Cocoaフレームワークではどちらのプロトコルも使われています。
例
- UIApplicationのデリゲート(UIApplicationDelegate)をAppDelegateにする
- UITextFieldのデリゲート(UITextFieldDelegate)をViewControllerにする
デリゲートメッセージの形式
- デリゲートメソッドの名前のつけ方には規約があります。
- メソッド名の先頭は、デリゲートする側の(AppKitまたはUIKitの)オブジェクト
- アプリケーション、ウインドウ、コントロール部品などの名前
- すべて小文字にし、接頭辞(「NS」、「UI」)を省いて使う(常にではない)
- 通常はこの後に、報告されたイベントの時制を表す助動詞(「Should」または「Will」)か(「Did」または「Has」)
- 戻り値を期待しない(戻り値型がvoid)メッセージにより起動されるデリゲートメソッドも多くの場合、「Did」 や「Will」など、イベントがすでに発生した、あるいは発生しようとしていることを表す字句が含まれる
- メソッド名の先頭は、デリゲートする側の(AppKitまたはUIKitの)オブジェクト
プロトコル
- すべてのデリゲートメソッドは非形式プロトコル(Objective-C/カテゴリ)として実装されている
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/デリゲート
- UIAccelerometerDelegate - UIAccelerometer
- UIActionSheetDelegate? - UIActionSheet
- UIAlertViewDelegate - UIAlertView
- UIApplicationDelegate - UIApplication
- UICollectionViewDelegate? - UICollectionView?
- UIDocumentInteractionControllerDelegate? - UIDocumentInteractionController
- UIGestureRecognizerDelegate? - UIGestureRecognizer?
- UIImagePickerControllerDelegate? - UIImagePickerController
- UINavigationBarDelegate? - UINavigationBar
- UINavigationControllerDelegate? - UINavigationController
- UIPageViewControllerDelegate? - UIPageViewController
- UIPickerViewAccessibilityDelegate? - UIPickerViewAccessibility?
- UIPickerViewDelegate? - UIPickerView
- UIPopoverControllerDelegate? - UIPopoverController?
- UIPrintInteractionControllerDelegate? - UIPrintInteractionController?
- UIScrollViewDelegate - UIScrollView
- UISearchBarDelegate? - UISearchBar?
- UISearchDisplayDelegate? - UISearchDisplay?
- UISplitViewControllerDelegate - UISplitViewController
- UITabBarControllerDelegate? - UITabBarController
- UITabBarDelegate? - UITabBar?
- UITableViewDelegate - UITableView
- UITextFieldDelegate - UITextField
- UITextInputDelegate? - UITextInput?
- UITextViewDelegate? - UITextView
- UIVideoEditorControllerDelegate? - UIVideoEditorController?
- UIWebViewDelegate - UIWebView
Cocoa/Foundation/デリゲート
- NSConnectionDelegate? - NSConnection?
- NSFileManagerDelegate? - NSFileManager
- NSKeyedArchiverDelegate? - NSKeyedArchiver
- NSKeyedUnarchiverDelegate? - NSKeyedUnarchiver?
- NSMachPortDelegate? - NSMachPort?
- NSMetadataQueryDelegate? - NSMetadataQuery?
- NSNetServiceBrowserDelegate? - NSNetServiceBrowser?
- NSNetServiceDelegate? - NSNetService
- NSPortDelegate? - NSPort
- NSSpellServerDelegate? - NSSpellServer?
- NSStreamDelegate? - NSStream?
- NSURLConnectionDataDelegate? - NSURLConnectionData?
- NSURLConnectionDelegate - NSURLConnection
- NSURLConnectionDelegate - NSURLConnection
- NSUserNotificationCenterDelegate? - NSUserNotificationCenter?
- NSXMLParserDelegate? - NSXMLParser
- NSXPCListenerDelegate? - NSXPCListener?
コードによる接続
- delegateプロパティにセットするsetDelegateメソッドがある。
- (void)awakeFromNib { [textView setDelegate:self]; }
- http://vivacocoa.jp/objective-c3e/chapter6b.html
デリゲートメッセージの形式
- デリゲートメソッドの名前のつけ方には規約があります。メソッド名の先頭は、デリゲートする側の(AppKitまたはUIKitの)オブジェクト、すなわち、アプリケーション、ウインドウ、コントロール部品などの名前です。すべて小文字にし、接頭辞(「NS」、「UI」)を省いて使います。(常にではありませんが)通常はこの後に、報告されたイベントの時制を表す助動詞が続きます。言い替えると、イベントが発生しようとしている(「Should」または「Will」)か、すでに発生したところである(「Did」または「Has」)かを表す助動詞です。このように時制を示すことにより、戻り値を期待するメッセージとそれ以外を分類できます。
動作
GUIからメソッドが呼ばれるときはこういうイメージ
// ターゲットがアクションを実装しているかどうか確認(セレクタの存在確認) if ([target respondsToSelector:actioin]) { // アクションを呼び出す [target performSelector:action withObject:self]; }
- respondsToSelector?で実行時に対応するメソッドが存在するかを確認され、メニューではこの結果でenable/disableが決まる