是否可以删除标签中的文本(
NSTextField
)?
我尝试使用字体面板,但显然当我尝试设置它们时这些被忽略了:
您可以这样做,假设
_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]];
}
对我来说,结合创建自定义
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];
}
我想分享一种更简单的方法和更多选项,并指出早期答案中的错误。
简单
要绕过字符串
length
,请使用 initWithString:attributes:
将属性应用于整个字符串。
错误
上述所有示例都为
kCFBooleanTrue
设置了布尔值 (NSStrikethroughStyleAttributeName
)。
这是不正确的,因为 NSStrikethroughStyleAttributeName
的数据类型是 NSUnderlineStyle
类型的整数。kCFBooleanTrue
的示例之所以有效,是因为它们将此布尔值转换为 NSNumber
,结果为值 1。这恰好与单行删除线 NSUnderlineStyleSingle
的值相匹配。
NSUnderlineStyle
可以提供更大的灵活性,例如使用粗线 (NSUnderlineStyleThick
) 或双线 (NSUnderlineStyleDouble
)。
奖励 2 - 颜色
删除线颜色也可以通过键
attributes:
在
NSStrikethroughColorAttributeName
字典中定义。
所有这些结合起来产生以下示例:
// Show text with a red single line strikethrough:
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"strikethrough"
attributes:@{
NSStrikethroughStyleAttributeName : [NSNumber numberWithInteger:NSUnderlineStyleSingle],
NSStrikethroughColorAttributeName : [NSColor systemRedColor]
}];
_textField.attributedStringValue = text;