そのための代理人がいます!- サブクラス化する必要はありません
IB で をウィンドウ/ビューにドラッグすると、テーブルのアウトレットがNSTableView
あることに気付くでしょう。menu
したがって、コンテキスト メニューを実装する非常に簡単な方法は、そのアウトレットをスタブ メニューに接続し、メニューのデリゲート アウトレットをNSMenuDelegate
プロトコル メソッドを実装するオブジェクトに接続することです。- (void)menuNeedsUpdate:(NSMenu *)menu

通常、メニューのデリゲートは、データソース/デリゲートをテーブルに提供するオブジェクトと同じですが、テーブルを所有するビュー コントローラーである場合もあります。
これに関する詳細については、ドキュメントをご覧ください
プロトコルで実行できる巧妙な機能のバンドルがありますが、非常に単純な実装は次のようになります。
#pragma mark tableview menu delegates
- (void)menuNeedsUpdate:(NSMenu *)menu
{
NSInteger clickedrow = [mytable clickedRow];
NSInteger clickedcol = [mytable clickedColumn];
if (clickedrow > -1 && clickedcol > -1) {
//construct a menu based on column and row
NSMenu *newmenu = [self constructMenuForRow:clickedrow andColumn:clickedcol];
//strip all the existing stuff
[menu removeAllItems];
//then repopulate with the menu that you just created
NSArray *itemarr = [NSArray arrayWithArray:[newmenu itemArray]];
for(NSMenuItem *item in itemarr)
{
[newmenu removeItem:[item retain]];
[menu addItem:item];
[item release];
}
}
}
そして、メニューを構築するメソッド。
-(NSMenu *)constructMenuForRow:(int)row andColumn:(int)col
{
NSMenu *contextMenu = [[[NSMenu alloc] initWithTitle:@"Context"] autorelease];
NSString *title1 = [NSString stringWithFormat:@"Delete %@",[self titleForRow:row]];
NSMenuItem *item1 = [[[NSMenuItem alloc] initWithTitle:title1 action:@selector(deleteObject:) keyEquivalent:@""] autorelease];
[contextMenu addItem:item1];
//
NSString *title2 = [NSString stringWithFormat:@"Save %@",[self titleForColumn:col]];
NSMenuItem *item2 = [[[NSMenuItem alloc] initWithTitle:title1 action:@selector(saveObject:) keyEquivalent:@""] autorelease];
[contextMenu addItem:item2];
return contextMenu;
}
どのように実装するかはtitleForRow:
、titleForColumn:
あなた次第です。
任意のオブジェクトをメニュー項目にバインドして、メソッドに情報を送信できるようにするNSMenuItem
プロパティを提供することに注意してください (例: )representedObject
deleteObject:
編集
注意 - サブクラスに実装- (void)menuNeedsUpdate:(NSMenu *)menu
するNSDocument
と、10.8 で表示されるタイトル バーに表示される自動保存/バージョン メニューが停止します。
それはまだ10.7で動作するので、図を見てください。NSDocument
いずれにせよ、メニューデリゲートはサブクラス以外のものである必要があります。