我正在实现一个 - (void)delete:方法,所以我可以在我的Cocoa应用程序中处理删除键。我希望它根据所选内容做不同的事情:对于文本字段,我想要默认行为(删除左边的字符),但对于NSBrowser项目,我希望它删除该项目。
我以为我会问Window是第一个响应者,然后看看第一个响应者是否等于我的NSBrowser的指针,但它从未匹配过。当我调试它时,我发现firstResponder指向NSBrowserTableView的一个实例,但我在文档中找不到它。
这是什么?
我还能怎样测试我的firstResponder是否是特定的tableView? (我想继承NSBrowser,但我倾向于避免子类化,我的第二个想法是添加一个标签,但我最喜欢我的第一个方法,如果只有firstResponder指向我的NSBrowser实例,当浏览器中的一个项目是选中。)
思想?
答案 0 :(得分:4)
实际上,@ uldyscousin只是部分正确。这个类绝对不是 NSBrowser的子类。
NSBrowserTableView是NSTableView用于显示每列的NSBrowser的私有子类。使用表格视图,因此有一个单独的位置来绘制分支图像(文件夹旁边的小箭头),同时保留行的其余部分由默认或用户定义的单元格绘制。
如果你考虑一下,实际上表视图(而不是浏览器)是第一个响应者是有意义的,因为活动列的表首先得到响应键击的破解,NSBrowser可以让NSTableView做它已经知道如何。 (例如,跳转到与用户键入的字母匹配的第一行。)
幸运的是,NSBrowserTableView有一个指针,指向它适用的浏览器。您可以通过-(NSBrowser*)browser
方法访问它。我建议你不要为这个特殊情况继承NSBrowser,因为你必须深入了解它的私有实现才能做任何有用的事情。
答案 1 :(得分:-1)
您在文档中找不到它,因为它是私有的。我的猜测是,当你实例化一个NSBrowser或一个NSTableView时,你实际上是在实例化这个私有类的子类,它本身就是NSControl的子类(在文档中指出 是NSBrowser和NSTableView的超类)。另一个例子是NSString表示为'NSCFString',我认为这是因为CFString和NSString是“免费桥接的”。
根据你的意愿拿出尽可能多的盐,但是我开始深入了解第一个响应者的方法是在我的代码中插入一个NSLog语句并突破它,看看日志中打印的是什么。您可以设置视图的标记并在语句中显示该标记。或者你可以要求你的第一个转发者的课程
NSStringFromClass([myFirstResponder class])
并显示。
希望这会有所帮助。