- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通过界面生成器添加的 NSTextView 对象。我可以更改已选择的文本段的背景颜色,如下所示。
- (void)emphasizeText {
NSColor *c = [colorWell.color colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; //colorWell is an NSColorWell object that has been added through interface builder
NSRange selection = textView1.selectedRange; //textView1 is an NSTextView object that has been added through interface builder
[textView1.textStorage addAttributes:@{NSBackgroundColorAttributeName:c} range:selection];
}
但是,我无法从所选文本段中删除添加的属性 (NSBackgroundColorAttributeName)。引用this topic ,我有以下代码。
- (void)deemphasizeText {
NSMutableAttributedString *aStr = [textView1.attributedString mutableCopy];
NSRange selection = textView1.selectedRange;
[aStr enumerateAttribute:NSBackgroundColorAttributeName inRange:selection options:0 usingBlock:^(id value,NSRange range,BOOL *stop) {
if (value) {
[aStr removeAttribute:NSBackgroundColorAttributeName range:range];
}
}];
}
尽管应用程序不会崩溃,但没有任何变化。我做了几种变体,例如
- (void)deemphasizeText {
NSRange selection = textView1.selectedRange;
NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc] initWithAttributedString:(NSMutableAttributedString *)[textView1.textStorage attributedSubstringFromRange:selection]];
[aStr enumerateAttribute:NSBackgroundColorAttributeName inRange:NSMakeRange(0,aStr.length) options:0 usingBlock:^(id value,NSRange range,BOOL *stop) {
if (value) {
[aStr removeAttribute:NSBackgroundColorAttributeName range:range];
}
}];
}
同样,选定的片段不会改变。我做错了什么?
非常感谢。
最佳答案
首先,您的 -deemphasizeText
方法显式使用文本存储可变字符串的副本。人们不会指望修改该副本来修改原始版本。
其次,您应该通过调用 -beginEditing
和 -endEditing
将文本存储的所有修改括起来。事实上,您确实应该在更改周围的 TextView 上调用 -shouldChangeTextInRange:replacementString:
和 -didChangeText
。
最后,无需枚举属性字符串并仅从其存在的范围中删除该属性。只需删除整个选择范围的属性即可。
所以:
- (void)emphasizeText {
NSColor *c = [colorWell.color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
NSRange selection = textView1.selectedRange;
if ([textView1 shouldChangeTextInRange:selection replacementString:nil])
{
NSTextStorage* storage = textView1.textStorage;
[storage beginEditing];
[storage addAttributes:@{NSBackgroundColorAttributeName:c} range:selection];
[storage endEditing];
[textView1 didChangeText];
}
}
- (void)deemphasizeText {
NSRange selection = textView1.selectedRange;
if ([textView1 shouldChangeTextInRange:selection replacementString:nil])
{
NSTextStorage* storage = textView1.textStorage;
[storage beginEditing];
[storage removeAttribute:NSBackgroundColorAttributeName range:selection];
[storage endEditing];
[textView1 didChangeText];
}
}
其他需要考虑的事情:
-rangeForUserCharacterAttributeChange
;检查其位置是否为 NSNotFound,如果是则中止;检查它是否与当前的 selectedRange
不同,如果是,则将 selectedRange
设置为匹配;然后在该范围内进行操作。-rangesForUserCharacterAttributeChange
和 -shouldChangeTextInRanges:replacementStrings:
支持多个选择范围。关于cocoa - 删除 NSTextView 文本选择的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576809/
如何调整 NSTextView 的文本以适合框的内容,而无需滚动?例如,如果用户输入一个长字符串,并且如果我稍后将该字符串显示为 NSTextView,我该如何使字体减小到足够小以适合该框? 最佳答案
我有一个包含格式化文本和嵌入图像的 NSTextView,如下所示。 我想将上面转换为纯文本,如下所示: Hi this is test data (...picture...)This is col
我对 Cocoa 很陌生,这可能是一个全新的问题。然而,我很沮丧。 我有一个非常简单的 Cocoa 应用程序(称为“行”)来测试将 1000 行文本发送到 TextView 。 我在 Xcode 4
我正在使用Markdown语法的Mac应用程序中的富文本编辑器上工作。我使用NSTextStorage监视Markdown语法中的匹配项,然后将样式实时应用于NSAttributedString,如下
当用户将数据粘贴到 NSTextView 中时,我需要收到通知,以便删除任何不允许的数据类型(url 链接等)。我不想使用 NSTextStorageDelegate 的 textStorageDid
我有一个继承自 NSTextView 的类,该类在初始化时使用 setContinouslySpellCheckingEnabled(true) 设置自动拼写检查,并且在聚焦时将自身设置为第一响应者。
如果您在 Mac 上安装 Microsoft Word 并打开文档,则可以通过按 Command + 2 将行距增加到 2。现在我的 cocoa 应用程序使用 NSTextView。我的用户希望应用程
NSTextView从哪里来? 在我的 OSX 应用程序中,我有一个 NSSearchField,我实现了 controlTextDidChange:,其中在键 NSFieldEditor 中包含一个
使用什么技术来创建一个包含电子邮件文本气泡的 TextView,与电子邮件中类似 最佳答案 这是一个 NSTokenField。看看它和 NSTokenFieldCell 类。如果您需要做的事情是高度
我想创建一个 TextView ,它将支持突出显示基本内容,例如链接和主题标签。类似的功能可以在 Twitter.app 中找到: 不需要支持点击这些链接,只需要在用户编辑 TextView 内容时正
我正在尝试更改 NSTextView 中的预设制表位。我发现了一个旧的帖子表单 2002,它说可以通过显示 NSTextView 的标尺然后编辑其上的选项卡来从 Interface Builder 中
我在 NSTextView 上打字时遇到挂起。 NSTextView 位于我以模态方式运行的窗口上。 [NSApp runModalForWindow:[自身窗口]]; 我不太确定是怎么回事,但我认为
我已经下载:NSTextView 突出显示:enter link description here 它按预期工作,如果您打开应用程序并输入符号“-”,它会变成红色,但后来我遇到了问题。我在.h文件中写
我正在尝试创建一个 NSTextView,其行为有点像一系列打字机页面 - 每个页面都有固定数量的可用行和列。 底层表示与显示完美匹配,而显示又与文件格式匹配。页面以换页符 '\f' 结尾。例如,两个
如何获取 NSTextView 插入符位置更改的回调? 我尝试过 KVO [textView addObserver:self forKeyPath:@"selectedRange" options:
我在 NSScrollView 中有一个 NSTextView,并且我以编程方式插入 NSView 子类作为 NSTextView 有什么方法可以让 NSTextView 接收其所有事件,即使我的 N
我的窗口上有一个 NSTextView 对象。我将 NSStrings 传递给它并显示出来。我想更改显示的文字大小。我怎么做?我是在检查器中执行此操作还是有办法在代码中执行此操作?请举个例子。谢谢!
我有一个带有 TextView 的 ScrollView 。如何找到当前选择的 TextView ? NSTextDelegate 中的委托(delegate)方法仅在您开始编辑时才起作用,而不是在首
我一定是做错了什么: 我的 Cocoa 应用程序有一个围绕自定义 View 的 ScrollView ,而自定义 View 又具有一个 TextView 。我只希望看到一个“这是一个”字符串,但角落里
我在使用 NSTextview 时遇到问题,它应该不断更新日志文件的内容。该应用程序是一个主从 UI,主视图包含一组“备份”对象,而详细 View 包含一个 NSTabView,其中一个选项卡包含 N
我是一名优秀的程序员,十分优秀!