【问题标题】:How can we get the whole text from selected text in UITextView?我们如何从 UITextView 中的选定文本中获取整个文本?
【发布时间】:2021-03-12 14:20:55
【问题描述】:

如果用户选择这样的部分,我如何才能在 UITextView 内的蓝色矩形中获取整个文本:

我当前的代码是只获取选定的文本:

if let range = textView.selectedTextRange {
    let selectedText = textView.text(in: range) {
        //selectedText
    }
}

【问题讨论】:

  • textView.text 获取文本
  • 不,我想要蓝色矩形中的文本,而不是所有 textView 中的文本
  • 你会在 NSLayoutManager developer.apple.com/documentation/uikit/nslayoutmanager 中找到你需要的方法,你可以从 textView 实例中访问。
  • 蓝色矩形内定义不明确。看起来您想要选择行的任何部分的所有连续行,但我只是在那里猜测。你能更具体地解释一下你的要求是什么吗?此外,如果您要包含代码,请包含足够的 实际 代码以使其有用;您提供的最小代码并没有告诉我们任何有用的信息。

标签: swift uikit


【解决方案1】:

您必须将您的视图控制器设置为文本视图委托UITextViewDelegate

override func viewDidLoad() {
    super.viewDidLoad()
    textView.delegate = self
}

实现textViewDidChangeSelection方法

func textViewDidChangeSelection(_ textView: UITextView)

在此函数中,您可以获得所选行的开头和结尾的UITextPosition,然后创建一个新范围并检索所选文本:

func textViewDidChangeSelection(_ textView: UITextView) {
    guard let selectedTextRange = textView.selectedTextRange,
          let start = textView.tokenizer
            .position(from: selectedTextRange.start, toBoundary: .line, inDirection: .backward),
           let end = textView.tokenizer
            .position(from: selectedTextRange.end, toBoundary: .line, inDirection: .forward),
           let range = textView.textRange(from: start, to: end),
           let text = textView.text(in: range)
    else { return }
    print(text)
}

将此扩展助手添加到您的项目中:

extension UITextDirection {
    static let forward: Self = .init(rawValue: 0)
    static let backward: Self = .init(rawValue: 1)
}

【讨论】:

  • 我不想要选中的文本,请阅读问题并查看图片,我想要蓝色矩形内的文本,而不仅仅是选中的文本
  • 抱歉错过阅读,我编辑我的答案:)
  • 谢谢!,将其范围作为 NSRange 而不是 UITextRange 是否简单?
  • 我觉得会很难,你应该找到行首和行尾的索引,然后创建一个NSRange,或许看看这个帖子:stackoverflow.com/questions/21149767/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多