objective-c - 如何制作包含属性文本但仅复制纯文本的 NSTextField

标签 objective-c cocoa appkit

我有一个 NSTextField 子类,它使用包含属性字符串的 NSTextFieldCell 子类。我希望当用户复制文本时将其复制到没有属性的粘贴板。

我尝试对 NSTextView 进行子类化,覆盖 copy: 并将 isFieldEditor 设置为 YES 并返回这个新编辑器来自单元格 fieldEditorForView 方法。虽然这在使用时仅复制纯文本,但我在文本上绘制的文本上绘制了文本(等等......),并且如果底层属性字符串被另一个控件更改,则字段编辑器保持不变。当我不使用 MyFieldEditor 并让 NSTextFieldCell 子类使用默认实现时,不会出现此问题。

有没有更简单的方法来解决这个问题?

是否还有其他需要我覆盖或接收委托(delegate)消息的内容?

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

最佳答案

请在下面找到应该更改的内容。 经过测试,可与 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) 添加窗口委托(delegate)方法,用字段编辑器替换目标文本字段(这是提供自定义字段编辑器的有效记录方法)

- (nullable id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(nullable id)client {
    if (client == self.textField) { // << in this case it is outlet
        return MyFieldEditor.new;
    }
    return nil;
}

更新:

如下重写 NSTextFieldCell 并在 XIB 中将其分配给目标 NSTextField 而不是上面的 NSWindow 委托(delegate)方法,可以提供相同的有效行为。

@interface MyTextCell: NSTextFieldCell
@end

@implementation MyTextCell
- (nullable NSTextView *)fieldEditorForView:(NSView *)controlView {
    id editor = MyFieldEditor.new;
    [super setUpFieldEditorAttributes:editor];
    return editor;
}
@end

关于objective-c - 如何制作包含属性文本但仅复制纯文本的 NSTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59782310/

相关文章:

iphone - 更改 CGContext 的背景颜色

cocoa - NSManagedObjectContext 的 userInfo 属性如何工作?

objective-c - Cocoa AppKit - 关闭模式窗口(即弹出窗口或上下文菜单)并按下当前悬停在上方的按钮

cocoa - Xcode 导航器控件类型

macos - AppKit/Cocoa 模拟风格的自定义 NSControl

ios - 在 iOS 中解析 OFX 或 SGML

ios - 为什么 block 在引用 self 时会创建保留循环?

ios - 如何一张一张删除UICollectionView图片

objective-c - cocoa : Action 处理

macos - 以编程方式从 1024 * 1024 大小的 NSImage 创建图标 (ICNS)