是否可以在标签(NSTextField
)中添加删除线?
我尝试使用字体面板,但是当我尝试设置它们时,它们似乎被忽略了:
是否可以在标签(NSTextField
)中添加删除线?
我尝试使用字体面板,但是当我尝试设置它们时,它们似乎被忽略了:
_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]];
}
对于我来说,结合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];
}
awakeFromNib
中,我不知道将插入文本字段中的文本长度。实际上,我使用Cocoa绑定,并且_我从未直接控制_文本字段的内容。是否有一种方法可以无论其内容都可以划掉标签? - DevNSTextFieldCell
只有font
和color
属性。你可以通过自定义NSTextFieldCell
子类(编写起来不应该太困难)来解决这个问题,或者绑定到一个自定义的粘合对象,每当通过绑定调用其 setter 时,在文本字段上调用setAttributedStringValue:
。或者你可以完全放弃绑定。这些解决方案都不是特别优雅,但我认为它们会起作用。 - sboothNSTextFieldCell
的想法。我创建了一个名为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]; }
。然而,不幸的是,它并没有按预期工作。 - DevsetStringValue:
方法。我已经更新了我的答案来展示这一点。当然,你还需要在 IB 中设置自定义单元格类。 - sboothsetStringValue:
方法。这就是为什么我尝试重写drawInteriorWithFrame:inView:
但没有成功的原因。 - DevsetObjectValue:
,可能是因为我的NSTextFieldCell
的值绑定到了一个NSNumber
。无论如何,当调用setAttributedStringValue
时,它会进入递归循环... - Dev