我有一个NSTextField
子类,该子类使用包含属性字符串的NSTextFieldCell
子类。如果用户将文本复制到没有属性的情况下复制到粘贴板,我希望这样做。
我已经尝试将NSTextView
子类化,重写copy:
并将isFieldEditor
设置为YES
,然后从单元格fieldEditorForView
方法返回此新编辑器。尽管每次使用时仅复制纯文本,但我还是在文本上绘制了文本(等等),并且如果基础属性字符串被另一个控件更改,则字段编辑器将保持不变。当我不使用MyFieldEditor
并让NSTextFieldCell
子类使用默认实现时,不会发生此问题。
是否有更简单的解决方案?
还有其他需要覆盖或接收委托消息的内容吗?
MyFieldCell.m
- (NSTextView *)fieldEditorForView:(NSView *)controlView
{
MyFieldEditor *editor = [[MyFieldEditor alloc] init];
[super setUpFieldEditorAttributes:editor];
return editor;
}
MyFieldEditor.m
@implementation MyFieldEditor
- (instancetype)init
{
if ( (self = [super init]) )
{
[self setFieldEditor:YES];
}
return self;
}
- (NSString *)selectedString
{
return [[self string] substringWithRange:[self selectedRange]];
}
- (void)copy:(id)sender
{
[[NSPasteboard generalPasteboard] setString:[self selectedString] forType:NSPasteboardTypeString];
}
@end
注意:我正在使用ARC。
请在下面找到应更改的内容。 经过测试并与Xcode 11.2.1 / macOS 10.15.2结合使用
a)不需要自定义NSTextFieldCell
和NSTextField
,因此仅使用默认值
b)更改为MyFieldEditor.m
中的以下内容>
- (void)copy:(id)sender { [NSPasteboard.generalPasteboard declareTypes:@[NSPasteboardTypeString] owner:self]; [NSPasteboard.generalPasteboard setString:[self selectedString] forType:NSPasteboardTypeString]; }
c)添加窗口委托方法,将字段编辑器替换为目标文本字段
- (nullable id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(nullable id)client {
if (client == self.textField) { // << in this case it is outlet
return MyFieldEditor.new;
}
return nil;
}