Mac OS X:删除标签中的文本(NSTextField)

Posted

技术标签:

【中文标题】Mac OS X:删除标签中的文本(NSTextField)【英文标题】:Mac OS X: strikethrough the text in a label (NSTextField) 【发布时间】:2011-11-09 18:19:48 【问题描述】:

是否可以删除标签中的文本 (NSTextField)?

我曾尝试使用字体面板,但显然在我尝试设置它们时会忽略它们:

【问题讨论】:

【参考方案1】:

你可以这样做,假设 _textField 在你的 xib 中设置为一个出口:

- (void) awakeFromNib

  NSMutableAttributedString *as = [[_textField attributedStringValue] mutableCopy];
  [as addAttribute:NSStrikethroughStyleAttributeName value:(NSNumber *)kCFBooleanTrue range:NSMakeRange(0, [as length])];
  [_textField setAttributedStringValue:[as autorelease]];

编辑:

如果您想编写自定义删除线 NSTextFieldCell 子类,则唯一需要覆盖的方法是 setStringValue:

- (void) setStringValue:(NSString *)aString

  NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:aString];
  [as addAttribute:NSStrikethroughStyleAttributeName value:(NSNumber *)kCFBooleanTrue range:NSMakeRange(0, [as length])];
  [self setAttributedStringValue:[as autorelease]];

【讨论】:

感谢您的回复。问题是在awakeFromNib 中我不知道将在文本字段中插入的文本的长度。事实上,我使用 Cocoa 绑定,并且我从不直接控制文本字段的内容。无论标签的内容如何,​​都没有办法删除标签? 我现在理解的更清楚了。 NSTextFieldCell 只有 fontcolor 属性。您可以使用自定义 NSTextFieldCell 子类解决此问题(编写起来应该不会太难),或者您可以绑定到自定义胶水对象,只要它的 setter 通过绑定调用,它就会在您的文本字段上调用 ​​setAttributedStringValue: .或者你可以完全放弃绑定。没有一个解决方案特别优雅,但我认为它们会起作用。 感谢子类NSTextFieldCell 的好主意。我创建了一个名为StrikethroughTextFieldCell 的子类,并重新实现了方法drawInteriorWithFrame:inView::- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView [super drawInteriorWithFrame:cellFrame inView:controlView]; NSMutableAttributedString *as = [self.attributedStringValue mutableCopy]; [as addAttribute:NSStrikethroughStyleAttributeName value:(NSNumber *)kCFBooleanTrue range:NSMakeRange(0, as.length)]; [self setAttributedStringValue:as]; 。然而,不幸的是,它并没有按预期工作。 您应该只需要覆盖setStringValue:。我已经更新了我的答案以显示这一点。此外,显然您需要在 IB 中设置自定义单元格类。 再次感谢您的宝贵时间。不幸的是,在我看来,当我使用 Cocoa Bindings 时,方法 setStringValue: 从未被调用过。这就是为什么我尝试覆盖drawInteriorWithFrame:inView:,但没有成功。【参考方案2】:

对我来说,通过创建自定义NSTextFieldCell 和覆盖drawInteriorWithFrame:inView: 的方法结合起来效果很好,如下所示:

- (void) drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
    [self setAttributedStringFromStringValue];
    [super drawInteriorWithFrame:cellFrame inView:controlView];



- (void) setAttributedStringFromStringValue   // add strikethrough
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.stringValue];
    [attributedString addAttribute:NSStrikethroughStyleAttributeName value:(NSNumber *)kCFBooleanTrue range:NSMakeRange(0, attributedString.length)];
    [self setAttributedStringValue:attributedString];

【讨论】:

以上是关于Mac OS X:删除标签中的文本(NSTextField)的主要内容,如果未能解决你的问题,请参考以下文章

mac os x10.10批量重命名教程:os x 10.10批量修改文件名步骤

在 SWIFT OS X 中以编程方式添加和删除 NSTextField

在 Mac OS X 上将代码粘贴到终端窗口中的 vim

删除 chart.js 中的 x 轴标签/文本

Mac OS X Mountain Lion 10.8 中的 Firefox X11

Mac OS X 上的 GCC 标志 -Os 来自哪里?