textViewDidChangeSelection 方法认为 textView.text 为空

textViewDidChangeSelection method thinks textView.text is empty

出于各种原因,只要更改选择,我都需要在文本视图中访问文本,因此我已经实现了委托方法textViewDidchangeSelection()进行此操作。但出于某种原因,当我尝试从该方法中访问 textView.text 时,有时它返回为空,即使它不是。以这段代码为例

func textViewDidChangeSelection(_ textView: UITextView) {
    print("Called textViewDidChangeSelection")

    if textView.text.isEmpty {
        print("textview is empty")
    } else {
        print("textview is not empty")
    }
}

在我的代码中使用这个例子,我点击了一个非空的 textView,有时它返回 "textview is empty." 它似乎最常发生在重新 运行 之后模拟器并单击任何 textView,但我也看到它发生在第一次单击 textView 时(在单击其他 textView 之后)或者当我从其他视图返回到包含 textView 的 UIView 时.

有人知道为什么会这样吗?

textViewDidChangeSelection(_ textView: UITextView)

在文本选择更改时调用,不一定仅在选择另一个 textView 时调用。事实上,在过去,textView 的 selectedRange 属性 用于 return 零(表示插入),但现在(根据 Apple)选择范围的长度可能不为零。当您在 textView 之外单击时,您的委托方法可能会触发初始 textView(您要离开的那个),如果它是空的,它会给您您看到的结果。

尝试提供您的 textView 标签并使用:

func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
    print("Selected \(textView.tag)")

    return true
}

看看能不能解决你的问题。当然,标签只是一种快速而肮脏的检查,您可能会在您的应用程序中使用更灵活的 textView 标识。