Cocoa 将文本粘贴到NSTextView时,如何仅粘贴纯文本?

Cocoa 将文本粘贴到NSTextView时,如何仅粘贴纯文本?,cocoa,copy-paste,nstextview,Cocoa,Copy Paste,Nstextview,当我将文本粘贴到NSTextView时,我希望只能粘贴纯文本。应删除所有的富文本格式,包括:字体、颜色、链接和段落样式。粘贴的所有文本应以文本视图的默认字体和样式显示。NSTextView默认接受富文本,如何禁用它?用于禁用富文本。使用以下方法定义自定义的NSTextView类: - (NSArray *)readablePasteboardTypes { return [NSArray arrayWithObjects:NSStringPboardType,

当我将文本粘贴到NSTextView时,我希望只能粘贴纯文本。应删除所有的富文本格式,包括:字体、颜色、链接和段落样式。粘贴的所有文本应以文本视图的默认字体和样式显示。NSTextView默认接受富文本,如何禁用它?

用于禁用富文本。

使用以下方法定义自定义的
NSTextView
类:

- (NSArray *)readablePasteboardTypes {
    return [NSArray arrayWithObjects:NSStringPboardType, 
            nil];
}
注意:从Mac OS X开始,粘贴板类型的新
typedef
被指定为
NSPasteboardTypeString
,而不是
NSStringPBoardType

- (NSArray *)readablePasteboardTypes {
    return [NSArray arrayWithObjects:NSPasteboardTypeString,
            nil];
}

上述解决方案确实解决了提问者粘贴文本的问题,但我认为提问者可能想要的不止这些。至少我来这里的时候是这样的

我只是希望文本字段中的所有字符始终具有相同的字体,而不管它们是通过编程方式插入的、从笔尖插入的、粘贴的、拖入的、键入的还是由圣诞老人插入的。我在Stack Overflow中搜索了这个更广泛的问题,但没有找到任何问题(或答案)

而不是这里给出的解决方案。详细地说,为文本字段指定一个实现此

- (void)textViewDidChangeSelection:(NSNotification *)note {
    NSTextView* textView = [note object] ;
    [textView setFont:[self fontIWant]] ;
}

完成了。这适用于我能想到要测试的所有边缘情况。这有点奇怪,观察到这个选择的变化。似乎观察视图文本对象的字符串值或注册NSTextDidChangeNotification更符合逻辑,但因为我已经设置了一个委托,而且上面的内容已经过测试,并得到了Nick Zitzmann的赞许,所以我选择了它。

NSTextView
中重写此方法:

- (NSString *)preferredPasteboardTypeFromArray:(NSArray *)availableTypes restrictedToTypesFromArray:(NSArray *)allowedTypes {
  if ([availableTypes containsObject:NSPasteboardTypeString]) {
    return NSPasteboardTypeString;
  }

  return [super preferredPasteboardTypeFromArray:availableTypes restrictedToTypesFromArray:allowedTypes];
}

对我来说,这对粘贴和拖放都有效。

但我需要在文本视图中为文本添加属性。我只想从粘贴的文本中删除富格文本格式。您可以尝试子类化以覆盖
-paste:
,然后调用
-pasteAsPlainText:
。我不确定这是否有效。这与调用
setRichText:NO
具有相同的效果,虽然它会将粘贴的富文本转换为纯文本,但也会禁用对富文本的拖放接收。我认为,最好是覆盖
粘贴:
并进行您自己的转换(甚至,正如@jtbandes所建议的,只需调用
粘贴文本:
。我认为这对大多数情况来说不是一个好的解决方案。似乎没有必要在光标每次移动位置时都更改字体,而对我来说,文本每次移动时都会稍微移动。