问题标签 [nstextstorage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
390 浏览

cocoa - 子类化 NSTextStorage 中断列表编辑

我有一个带有标准的基本 Mac 应用程序NSTextView。我正在尝试实现和使用 的子类NSTextStorage,但即使是非常基本的实现也会破坏列表编辑行为:

  1. 我添加了一个包含两个项目的项目符号列表
  2. 我将该列表进一步复制并粘贴到文档中
  3. 在粘贴的列表中按 Enter 会中断最后一个列表项的格式。

这是一个快速视频:

NSTextStorage 列表问题

两个问题:

  1. 粘贴列表的项目符号使用较小的字体大小
  2. 在第二个列表项后按 Enter 会破坏第三个项目

当我不替换文本存储时,这很好用。

这是我的代码:

ViewController.swift

TestTextStorage.swift

0 投票
0 回答
432 浏览

ios - 如何使用 NSLayoutManager 用自定义绘图替换文本附件?

我的最终目标是让用户能够将文本拆分为一个NSTextViewUITextView多个部分,其中两个后续部分在视觉上由自定义视图分隔符分隔(可能,但不一定是水平规则 - 我希望能够调整分离器的视觉外观没有麻烦)。

分节分隔符的示例屏幕截图

我需要一个适用于两个平台的解决方案:macOS 和 iOS

(我的相关问题集中在 macOS 的解决方案上,其中一个使用了NSTextAttachmentCelliOS 上不可用的 s 。)

我目前解决这个问题的方法如下:

  1. 我在窗口的工具栏中有一个按钮来插入分节符。
  2. 当用户点击该按钮时,我会创建一个没有文本但带有文本附件的新属性字符串:

    SectionChangeTextAttachment是我创建的自定义子类,NSTextAttachment以便能够将此分节符附件与其他可能的附件区分开来。)

  3. 我将其插入attachmentString到当前光标位置的文本存储中:

    /li>
  4. 我创建了一个自定义NSLayoutManager子类。它的任务是找到类的所有附件,SectionChangeTextAttachment并用分隔图(或字形?)替换所有出现的地方。这就是问题所在:由于 Apple 的文档有限且部分过时,我无法弄清楚如何做到这一点。

所以我的问题是:

如何让我的布局管理器使用比字符/字形占用更多空间的自定义绘图(分隔符)替换附件字符(带有特定附件)?

(我猜附件字符没有字形,因此布局管理器没有为它提供任何空间。)

为了使这项工作,我需要覆盖哪些方法?

(这种方法一开始是否有意义?)

0 投票
1 回答
159 浏览

ios - 编辑属性字符串时调用哪种替换方法?

NSMutableAttributedString定义了两种字符串替换方法:

我创建了一个子类,NSTextStorage它又是NSMutableAttributedString. 在那个子类中,我覆盖了上述两种方法。

令我惊讶的是,当我在文本视图中键入或粘贴某些内容时,永远不会调用后一种方法(传递属性替换字符串)。它只是每次调用的纯字符串替换方法。

这引出了一个问题:
这两种方法实际上是根据哪些规则调用的当用户在文本视图中编辑文本时,

(我需要在我的文本存储中执行不同的操作,具体取决于属性替换字符串是否包含特定类型的文本附件。但是如果从不调用属性字符串的替换方法,我看不出如何进行这种区分。 )

0 投票
3 回答
372 浏览

ios - 将文本视图的属性字符串细分为(可参考的)部分

我正在尝试实现一个非常简单的文本编辑器,它应该可以NSTextView在 macOS 和UITextViewiOS 上使用。这个文本编辑器有一个工具栏按钮“ Section Break ”,每次点击它都会在当前光标位置插入一个新的部分。一个部分应该是:

  1. 在视觉上可识别为一个部分(通过在两个后续部分之间添加视觉分隔符并可能添加一些垂直空格),

  2. 可参考。用户应该能够在编辑器中看到所有部分的列表,并且通过单击该列表中的项目,文本视图应该立即滚动到该部分的开头。

另一个问题中,我问如何解决第一个问题,不幸的是,我还没有找到关于这部分的答案(即使有一个适用于 macOS 的解决方案)。

然而,这个问题集中在第二个方面:
如何在我的文本视图中维护所有部分的列表,其中每个部分都保持对相关文本的准确引用?

此任务的复杂性在于用户可以随时复制和粘贴或简单地编辑文本的任何部分。因此,我不能保留一个简单的段落编号数组或类似的东西。

文本视图中几个部分的屏幕截图


我尝试过的以及为什么这似乎是一项艰巨的任务:

  1. 我的一个想法是子类NSTextStorage化并使用一组可变属性字符串作为其内部存储。然后我会使用一个特殊的子类,NSTextAttachment并将其用作我的文本存储中的分节指示符。问题在于文本视图仅在用户编辑文本时调用以下方法

    第一种方法只传递没有任何属性的纯字符串,第二种方法只获取属性。这意味着在第一种方法中,我无法判断替换字符是否实际上应该是分节符,因此我无法决定在我的内部文本存储数组中的哪个位置创建新元素。

    在第二种方法中,我不知道用户是否实际添加了新文本(在这种情况下,我必须在我的文本存储数组中为每个分节符属性添加一个新元素),或者用户是否只是更改了现有的某些属性文本(在这种情况下,之前已经创建了新的数组元素)。

  2. 我还考虑过在表格视图或堆栈视图中使用多个文本视图的想法。但是,这不起作用,因为它会阻止用户在多个后续部分中选择(和删除)文本。

  3. 最后,我尝试了 subclassing NSLayoutManager,但是关于它的文档真的很薄,对我来说似乎是错误的地方。(毕竟布局管理器的职责是文本的布局,而不是跟踪它的结构。)

有任何想法吗?

0 投票
1 回答
636 浏览

ios - 在 NSTextStorage 范围内崩溃

我有一个 UITextView 应该接收从 HTML 收缩的 NSAttributesString。最终结果是带有自定义下划线的黑色文本链接。我在射程上坠毁。

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“NSMutableRLEArray objectAtIndex:effectiveRange:: Out of bounds”

这是代码:

当我评论这一行时:textView.text = text

并取消注释,所有崩溃:textView.attributedText = htmlStyleAttributeText(text: text)

0 投票
2 回答
1648 浏览

nstextview - 在 Swift 中使用 NSLayoutManager 隐藏 Markdown 字符

我正在使用 Markdown 语法的 Mac 应用程序中开发富文本编辑器。我用NSTextStorageMarkdown 语法观察匹配,然后NSAttributedString像这样实时应用样式:

在此处输入图像描述

在这一点上,我已经在这件事上不知所措,但我很高兴能取得进展。:)本教程非常有帮助

下一步,我想在's 字符串呈现时隐藏 Markdown 字符。NSTextView所以在上面的例子中,一旦输入了最后一个星号,我希望* *隐藏这些字符,只看到sample粗体。

我正在使用NSLayoutManager委托,我可以看到匹配的字符串,但我不清楚如何使用该shouldGenerateGlyphs方法生成修改后的字形/属性。这是我到目前为止所拥有的:

如何setGlyphs根据我发现隐藏星号的文本范围修改要传递的内容?

0 投票
1 回答
1104 浏览

swift - 替换 NSTextStorage 中的 NSAttributedString 移动 NSTextView 光标

我按照本教程创建了它的 Mac 版本。它工作得很好,除了有一个我无法弄清楚的错误。如果您尝试编辑字符串中间的任何内容,光标会跳到字符串的末尾。像这样:

NSTextView 光标跳转到结束

这是一个示例项目,或者您可以创建一个新的 macOS 项目并将其放在默认的ViewController.swift中:

然后创建一个带有以下子类的FancyTextStorageNSTextStorage

似乎当字符串被重写时,它不会保留光标位置,但是 iOS 上的相同代码(来自上述教程)没有这个问题。

有任何想法吗?

0 投票
0 回答
112 浏览

swift - 在不破坏撤消堆栈的情况下在 NSTextView 中附加文本

我有一个基于 NSTextView 的应用程序,其中有各种更改文本的命令。为了替换一部分,我使用以下代码段:

当我想在文本视图的末尾追加时,我的问题就开始了。在那种情况下,我不能使用shouldChangeTextInRange:range replacementString:string,所以我使用:

虽然它适用于属性,但 Undo 完全中断。知道如何解决这个问题吗?

0 投票
1 回答
211 浏览

ios - 在 UITextView 中逐字删除 Slide-to-type 在 `shouldChangeText` 委托方法中给出了不正确的范围

我在 ViewController 中有一个 UITextView。我已经从UITextViewDelegate实现了 shouldChangeTextInRange委托方法。我通过上述删除单个字符的委托方法获得的范围值类似于{location, 1}

但是,如果我在执行删除操作之前使用滑动输入机制插入一个单词,则整个单词将被删除,而不是单个字符。我需要跟踪这一点。

例如,我使用滑动输入机制插入“Hello”。如果我按键盘上的删除键,我会得到 {4, 1} 作为范围,但整个单词“Hello”已在文本视图中被删除。在这种情况下,我需要将范围设为 {0, 5},就像选择文本“Hello”并删除它一样。

有没有办法区分普通删除操作和滑动式删除操作?如何获取文本视图中已删除的实际范围?

非常感谢您的帮助。

这是我尝试过的。

编辑1:

我有一个单独的存储机制,我根据shouldChangeText委托方法中提供的范围和替换文本更新对文本视图所做的更改。为了简单起见,我没有包括在内。

0 投票
1 回答
632 浏览

ios - ios - 输入时在 UITextView 中替换/删除字符 [• ]

我有一个带有自定义 NSTextStorage 的 UITextView,如果前一行以列表项目符号开头,我会在每个 Enter 之后添加一个列表项目符号。

当用户输入并且光标所在行的开头只有一个列表项目符号时,我删除列表项目符号并留在该行。

第一个功能按预期工作。但我很难弄清楚如何删除列表项目符号。


是上面的代码不起作用。我可能没有使用正确的范围。

这是我所有的代码。

文本存储


我用也用过self.deleteCharacters(in:)下面的函数来代替。它也没有工作。


总而言之,我只需要在用户输入并停留在该行时删除光标所在的单词。

如果您能帮我解决这个问题,我将不胜感激。

更新

如何测试这段代码?

  1. 在第一行,添加一个项目符号+一个空格[•],写几个字并输入。
  2. 从这一点开始,它添加了一个项目符号,因为前一行以项目符号开头。