我如何制作一个包含属性文本但仅复制纯文本的NSTextField

问题描述 投票:0回答:1

我有一个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。

显示问题图像

Drawing problem

objective-c cocoa appkit
1个回答
0
投票

请在下面找到应更改的内容。 经过测试并与Xcode 11.2.1 / macOS 10.15.2结合使用

a)不需要自定义NSTextFieldCellNSTextField,因此仅使用默认值

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.