2

我正在实现一个 -(void)delete: 方法,这样我就可以在我的 Cocoa 应用程序中处理删除键。我希望它根据选择的内容做不同的事情:对于文本字段,我想要默认行为(删除左侧的字符),但对于 NSBrowser 项目,我希望它删除该项目。

我想我会向 Window 询问它的第一响应者,然后查看该第一响应者是否等于我的 NSBrowser 的指针,但它从未匹配。当我调试它时,我发现 firstResponder 指向的是 NSBrowserTableView 的一个实例,但我在文档中找不到。

它是什么?

我还能如何测试我的 firstResponder 是否是一个特定的 tableView?(我想过子类化 NSBrowser 但我倾向于避免子类化,我的第二个想法是添加一个标签,但我最喜欢我的第一种方法,如果只有 firstResponder 会在浏览器中的一个项目指向我的 NSBrowser 实例时选择。)

想法?

4

2 回答 2

4

实际上,@trudyscousin 只是部分正确。这个类绝对不是NSBrowser 的子类。

NSBrowserTableView 是NSBrowser用来显示每一列的NSTableView的私有子类。使用表格视图,因此有一个单独的位置来绘制分支图像(在文件夹旁边绘制的小箭头),同时让行的其余部分由默认或用户定义的单元格绘制。

如果您考虑一下,实际上表视图(而不是浏览器)是第一个响应者是有道理的,因为活动列的表会首先响应击键,而 NSBrowser 可以让 NSTableView 做它已经做的事情知道怎么做。(例如,跳转到与用户键入的字母匹配的第一行。)

幸运的是,NSBrowserTableView 有一个指针指向它工作的浏览器。您可以通过它的-(NSBrowser*)browser方法访问它。对于这种特殊情况,我建议您不要将 NSBrowser 子类化,因为您必须深入了解它的私有实现才能做任何有用的事情。

于 2011-02-14T17:13:59.323 回答
-1

您无法在文档中找到它,因为它是私有的。我的猜测是,当你实例化一个 NSBrowser 或 NSTableView 时,你实际上是在实例化这个私有类的一个子类,它本身就是 NSControl 的一个子类(在文档中指出它NSBrowser 和 NSTableView 的超类)。另一个例子是 NSString 表示为“NSCFString”,我认为这是对 CFString 和 NSString 是“免费桥接”这一事实的暗示。

随心所欲地使用尽可能多的盐粒,但是我要深入了解第一响应者的方法是在我的代码中插入一个 NSLog 语句并打破它,查看日志中打印的内容。您可以设置视图的标签并将其显示在语句中。或者你可以要求你的第一个回复者的课程

NSStringFromClass([myFirstResponder class]) 

并显示出来。

希望这有帮助。

于 2010-12-11T17:37:36.120 回答