感谢您的问题,我还将从 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 之上的视图层次结构的各个级别上工作。它的功能不必首先选择行(这似乎是在 Apples 文档中假设的)。
问候,乔治·劳伦斯·斯托姆,美国华盛顿州马尔特比