5

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

我怎样才能获得命令-A 的出色功能选择所有文本?我不是指行选择。我为表格视图禁用了行选择。我的意思是用蓝色突出显示文本,以便您可以将其复制到剪贴板。但不仅仅是一行中的 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 的 WebView,你如何获得对剪贴板的控制?即在 Skype 中,您选择文本,仅突出显示对话,而不是每条消息的时间戳。此外,复制到剪贴板的文本格式也非常好。你能指出我对Skype进行逆向工程的正确方向吗?

4

2 回答 2

3

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

  1. 实际上,只有一个文本视图的文本会以“实时”突出显示颜色突出显示;其他将具有非重点控件的灰色突出显示。

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

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

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

了解了这一切之后,您可能能够通过让控制器在文本视图和表格视图子类对全选消息的特殊处理中成为第一响应者来“伪造”它。收到此消息后,文本视图子类可以调用 super 然后通知控制器(以获取其默认行为并让您知道它发生了),此时控制器可以转身并将命令发送到所有(现有)文本视图. 可以通过覆盖文本视图的绘图来欺骗突出显示,并且拖动启动可以遵循委托(控制器),该委托将处理将模型中的所有字符串写入粘贴板(甚至不触摸可能不存在的行视图中的文本视图)。

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

于 2013-11-12T01:39:35.407 回答
0

试试这样: -

首先以编程方式创建按钮,然后在创建按钮后编写此代码,并在您的加载方法或 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
于 2013-11-06T06:07:37.980 回答