如何使命令-A在NSTableView中的行中选择所有NSTextView文本?

时间:2013-11-05 23:36:42

标签: objective-c cocoa nstableview nsview nstextview

因此,如果我有一个基于NSView的表视图,并且视图内部是NSTextViews,它们是不可编辑但可选择的......

如何才能获得命令-A的所有功能,选择所有文本?我不是指行选择。我为tableview禁用了行选择。我的意思是用蓝色突出显示文本,以便将其复制到剪贴板。但不只是一行中的1个NSTextView文本,所有行都来自所有行。

除了命令 - 点击和拖动也应该这样做。但开箱即用似乎我只能选择一行的文字。这是显示问题的视频:

https://dl.dropboxusercontent.com/u/2510380/table.mov (我一直点击并拖动但不能突出显示下一行的文字)

这是两个执行此操作的mac应用程序(skype和gabble):

https://dl.dropboxusercontent.com/u/2510380/skype.mov

https://dl.dropboxusercontent.com/u/2510380/gabble.mov

假设他们不使用仅包含HTML的WebViews,那么如何通过剪贴板获得此控制?即在Skype中,您选择文本,仅突出显示会话,而不是每条消息的时间戳。复制到剪贴板的文本格式也非常好。你能指出我正确的方向来反向设计skype吗?

2 个答案:

答案 0 :(得分:3)

不幸的是,没有办法轻易做到这一点。这是因为一次只有一个控件可以是第一个响应者。这意味着,虽然您可以在多个文本视图中进行选择,但存在以下几个问题:

  1. 实际上只会使用“实时”高亮颜色突出显示一个文本视图的文本;其他人将拥有非聚焦控件的灰色亮点。

  2. 复制命令仅适用于第一响应者文本视图。

  3. 拖动会话启动将从鼠标实际指向的控件启动(与第一响应者无关),并且只会拖动该控件的文本。

  4. 在基于视图的表格视图中,对于当前未显示的行,控件可能甚至“不存在”,因此除非您强制创建每一行,否则它永远不会收到消息,这对于大桌子。

  5. 了解所有这些,你可能能够通过让你的控制器在文本视图和表视图子类中首次响应时选择所有消息的特殊处理来“伪装”它。收到此消息后,文本视图子类可以调用super然后通知控制器(获取其默认行为并让您知道它发生了),此时控制器可以转向并将命令发送到所有(现有)文本视图。通过覆盖文本视图的绘图可以欺骗突出显示,并且拖动启动可以推迟到委托(控制器),该委托将处理将模型中的所有字符串写入粘贴板(甚至不会触及可能不存在的行视图中的文本视图) )。表视图子类只是将相同的select-all消息传递给控制器​​而不调用super(甚至强制确保在返回for good measure之前没有选择任何内容)。

    我希望这会有所帮助。如果我忘记了你的任何要求,请告诉我。

答案 1 :(得分:0)

试试这样: -

首先以编程方式创建按钮,然后在创建按钮后编写此代码,并在load方法或awakefromnib方法中编写此代码。

   NSButton *Buttn=// alloc initwithframe;

  [Buttn setKeyEquivalentModifierMask: 
NSCommandKeyMask];
[Buttn setKeyEquivalent:@"A"];
[Buttn     
setAction:@selector(yourmeth:)];
 [Buttn setTarget:self];

 // now when you press cmd a write 
 below code in action method
- (void)selectRowIndexes:(NSIndexSet
 *)indexes byExtendingSelection:
   (BOOL)extend