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

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

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

NSTextField
)?

我尝试使用字体面板,但显然当我尝试设置它们时这些被忽略了:

enter image description here

enter image description here

cocoa macos interface-builder nstextfield strikethrough
3个回答
6
投票

您可以这样做,假设

_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]];
}

1
投票

对我来说,结合创建自定义

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];
}

0
投票

我想分享一种更简单的方法和更多选项,并指出早期答案中的错误。

简单
要绕过字符串

length
,请使用
initWithString:attributes:
将属性应用于整个字符串。

错误
上述所有示例都为

kCFBooleanTrue
设置了布尔值 (
NSStrikethroughStyleAttributeName
)。 这是不正确的,因为
NSStrikethroughStyleAttributeName
的数据类型是
NSUnderlineStyle
类型的整数。
上面使用
kCFBooleanTrue
的示例之所以有效,是因为它们将此布尔值转换为
NSNumber
,结果为值 1。这恰好与单行删除线
NSUnderlineStyleSingle
的值相匹配。

奖励 1 - 风格
正确使用

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