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
只有 font
和 color
属性。您可以使用自定义 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