ご質問ありがとうございます。NSTableViewのボタンからもアクションをトリガーします。あなたの質問は私を正しい道に導くのに役立ちました。
最初に、NSTableViewがオンになっている行番号を見つけるためのソリューションに取り組みます。ボタンを知らなくても見つけることができました。カスタムNSTableViewに、最初の試みとして次のものをインストールしました。
- (NSInteger)myRowNumber
{
return [(NSTableView*)self.superview.superview rowForView:self];
}
これは正常に機能しますが、堅牢ではありません。これは、ビュー階層の深さを具体的に知っている場合にのみ機能します。より堅牢で普遍的なソリューションは次のとおりです。
- (NSInteger)myRowNumber
{
NSTableView* tableView = nil;
NSView* mySuperview = self;
do
{
NSView* nextSuper = mySuperview.superview;
if (nextSuper == nil)
{
NSException *exception =
[NSException exceptionWithName:@"NSTableView not found."
reason:[NSString stringWithFormat:@"%@ search went too deep.",
NSStringFromSelector(_cmd)] userInfo:nil];
@throw exception;
}
if ([nextSuper isKindOfClass:[NSTableView class]])
tableView = (NSTableView*)nextSuper;
else
mySuperview = mySuperview.superview;
} while (tableView == nil);
return [tableView rowForView:self];
}
これは、NSTableViewレベルで機能するだけでなく、ビュー階層がどれほど複雑であっても、その上の任意のレベルにインストールされているものすべてで機能します。
あなたの質問の未回答の部分に関しては、私はクラスにIBOutletを確立し、ファイル所有者(私の場合はドキュメントクラス)に関連付けられたインターフェイスビルダーを使用しました。メッセージの送信先のクラスと行番号への参照を取得したら、関数を呼び出します。私の場合、呼び出しでは、発信元の行番号を渡す必要がありました。
[self.myDoc doSomethingToRow:self.myRowNumber];
これをテストしたところ、NSTableViewの上のビュー階層のさまざまなレベルで機能します。また、最初に行を選択しなくても機能します(これは、Appleのドキュメントで想定されているようです)。
よろしく、ジョージローレンスストーム、モルトビー、ワシントン、米国