【问题标题】:How can I make command-A select all the NSTextView text in rows in an NSTableView?如何使命令-A 选择 NSTableView 中行中的所有 NSTextView 文本?
【发布时间】:2013-11-05 23:36:41
【问题描述】:

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

如何获得命令-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进行逆向工程的正确方向吗?

【问题讨论】:

  • 你之前的问题还有效吗?
  • 我不确定是否应该删除它?我重新编写了这个新问题,因为我现在确信我应该使用 tableview。所以是的,从某种意义上说,如果将视图添加为子视图的滚动视图是一种更好的方法,那么这仍然是一个有效的问题,那么我在选择文本时仍然遇到同样的问题。
  • 我赞成并关注这两个问题,因此我会密切关注这个问题。希望明天有时间亲自尝试一下。
  • 这是一个视频,展示了我的 nstableview 问题:dl.dropboxusercontent.com/u/2510380/table.mov 我一直点击并拖动,但无法突出显示下一行的文本。
  • 您意识到 - 在 Mac 上,您想要的不是 Control-A,而是 Command-A。我不记得这是否开箱即用,只是想确保您拥有正确的组合键。

标签: objective-c cocoa nstableview nsview nstextview


【解决方案1】:

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

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

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

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

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

了解这一切后,您也许可以通过让您的控制器参与文本视图和表格视图子类对全选消息的特殊处理(当它是第一响应者时)来“伪造”它。收到此消息后,文本视图子类可以调用 super 然后通知控制器(以获取其默认行为并让您知道它发生了),此时控制器可以转身并将命令发送到所有(现有)文本视图.可以通过覆盖文本视图的绘图来欺骗突出显示,并且拖动启动可以遵循委托(控制器),该委托将处理将模型中的所有字符串写入粘贴板(甚至不触摸可能不存在的行视图中的文本视图)。表格视图子类将简单地将相同的全选消息传递给控制器​​而不调用 super(甚至强制确保在返回之前没有选择任何内容)。

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

【讨论】:

  • 经过进一步检查,您似乎也想要拖动选择行为。我推荐的方法无法解决这个问题(至少在我能想到的范围内,至少不是很容易)。
  • 谢谢 Joshua Nozzi,他的帮助让我得到了答案,我的问题全错了。我不应该使用 NSTableView 我应该只使用 1 个带有 NSTextTable 和 NSMutableAttributedString 的 NSTextView。
  • 澄清:文本系统的委托方法允许您在用户拖动选择时指定特定(非连续)范围。这意味着当用户拖动选择或 Cmd-A-选择文本时,您可以省略头像图像附件和时间戳,只留下消息文本。文本表可以帮助格式化。
【解决方案2】:

试试这样:-

首先以编程方式创建按钮,然后在创建按钮后编写此代码,并在您的加载方法或 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 2017-01-24
  • 1970-01-01
  • 2015-07-03
  • 2022-10-08
  • 2021-04-11
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多