ios - 如何在不调用 textViewDidChangeSelection 的情况下设置 NSAttributedString 属性?

标签 ios swift uitextview nsattributedstring uitextviewdelegate

我正在尝试做的事情:

UITextView 中有一个属性文本,当用户点击文本某处(不是选择文本,只是将闪烁的光标放在其他地方)时,光标周围的整个句子都会改变颜色。

我是如何尝试做到这一点的:

   private func setFocus(boundarySymbols: CharacterSet) {
    let mutableString = NSMutableAttributedString(attributedString: noteTextView.attributedText)

    mutableString.beginEditing()

    unfocusWholeText(mutableString: mutableString)
    let selectedRange = noteTextView.selectedRange
    guard let caretPosition = findCaretPosition() else { return }
    guard let focusRange = findRangeToFocus(in: noteTextView.text, around: caretPosition, of: boundarySymbols) else { return }
    text.addAttribute(NSForegroundColorAttributeName, value: ThemeManager.theme.note.text, range: focusRange)

    mutableString.endEditing()

    noteTextView.attributedText = mutableString
    noteTextView.selectedRange = selectedRange
}

当我在 UITextViewDelegateshouldChangeTextIn 方法中调用此函数时效果很好,但它仅在用户输入时有效,我也想在用户输入时调用此函数仅更改选择,因此 textViewDidChangeSelection 似乎非常适合。

但是有个问题:

当我将修改后的 attributedString 分配给 UITextView 时,它会将光标移动到文本的末尾(通过保存光标位置并在所有更改后重新设置来修复它)。但问题是这两个东西都在移动光标并且再次调用 textViewDidChangeSelection 所以无限循环发生(textViewDidChangeSelection 正在调用我的 setFocus 这是修改光标位置,因此再次调用 textViewDidChangeSelection)。

那么问题是:

我可以更改 attributedString 的属性(基本上只是颜色)而不创建 NSMutableAttributedString 并将其重新分配给 UITextView.attributedText 以省略将光标移动到文本末尾并返回吗?

或者也许有一种方法可以在不应该移动光标时以某种方式关闭它,或者让它暂时不调用委托(delegate)?

最佳答案

经过长时间的斗争,我最终找到了我之前没有想到的简单解决方法。

setFocus 中放置在 textViewDidChangeSelection 函数中,我将 UITextViewDelegate 设置为 nil 并在更改颜色和设置光标后我再次分配委托(delegate)。不是一个干净的解决方案,但至少有效。

关于ios - 如何在不调用 textViewDidChangeSelection 的情况下设置 NSAttributedString 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45743198/

相关文章:

ios - SWRevealViewController - 防止与后 View 交互

ios - ExternalAccessory - 教程 - 如何 - 模拟器

ios - 在 swift 2.0 中一次显示一个字符的文本

ios - AutoLayout 内容不适合 UITableView 单元格

ios - 点击按钮执行某些操作,然后转到另一个 View Controller

ios - 企业 Mac 应用分发

ios - 使用 CloudKit 延迟后触发推送通知

swift - 无法在 IOS10 中锁定一个 View Controller 的旋转

swift - EXC_BAD_INSTRUCTION 错误

ios - 在 UITableViewController 中使用 UITextView - 点击外部以关闭键盘