Mac OS X:如何在标签(NSTextField)中给文本加上删除线

5

是否可以在标签(NSTextField)中添加删除线?

我尝试使用字体面板,但是当我尝试设置它们时,它们似乎被忽略了:

enter image description here

enter image description here

2个回答

6
假设在您的xib文件中,已经将_textField设置为outlet,则可以按照以下方式完成此操作:
- (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绑定,并且_我从未直接控制_文本字段的内容。是否有一种方法可以无论其内容都可以划掉标签? - Dev
1
我现在更清楚地理解了。NSTextFieldCell 只有 fontcolor 属性。你可以通过自定义 NSTextFieldCell 子类(编写起来不应该太困难)来解决这个问题,或者绑定到一个自定义的粘合对象,每当通过绑定调用其 setter 时,在文本字段上调用 setAttributedStringValue:。或者你可以完全放弃绑定。这些解决方案都不是特别优雅,但我认为它们会起作用。 - sbooth
感谢您提供了一个很好的子类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]; }。然而,不幸的是,它并没有按预期工作。 - Dev
1
你只需要重写 setStringValue: 方法。我已经更新了我的答案来展示这一点。当然,你还需要在 IB 中设置自定义单元格类。 - sbooth
非常感谢您的时间。不幸的是,当我使用Cocoa绑定时,似乎从未调用setStringValue:方法。这就是为什么我尝试重写drawInteriorWithFrame:inView:但没有成功的原因。 - Dev
只是一个简短的更新:似乎调用了setObjectValue:,可能是因为我的NSTextFieldCell的值绑定到了一个NSNumber。无论如何,当调用setAttributedStringValue时,它会进入递归循环... - Dev

1

对于我来说,结合sbooth的方法创建自定义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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接