限制在 UITextView 范围内编辑

Restrict edit in range in UITextView

我有一个 NSRanges 数组,我希望这些范围在我的 UITextView 中是 immutable/readonly。 但是我不太确定应该如何将编辑限制在数组中不存在的范围内。

我尝试了以下方法。

 func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

          for range in immutableRange {

            if changeRange.location == range.location {
                return false
            }
        }
        return true
    }

但这没有按预期工作。 我怎样才能解决这个问题,所以只允许用户更改数组中未包含的范围内的文本?

编辑:

我也试过使用以下方法:

NSLocationInRange(immutableRange.location, changeRange) && NSLocationInRange(NSMaxRange(immutableRange), changeRange)

检查 changeRange 是否包含 immutableRange,但这也没有按预期工作。

我有以下类型的字符串:"There is ______ red flowers, ______ green flowers and ______ yellow flowers",其中除“____”之外的所有内容都是不可变范围。

您对每个范围的检查都不正确。而不是查看每个范围是否相等,您需要检查每个范围是否相交:

for range in immutableRange {
    var overlap = NSIntersectionRange(changeRange, range)
    if overlap.length != 0 {
        return false // the ranges overlap
    }
}

我不流利Swift。上面的代码可能有语法错误。根据需要修复。

此外,这只是对您要实现的目标的部分修复。这将保护原始字符串的只读部分,但您需要更多代码才能正确允许用户在未受保护的区域中键入内容,而不会弄乱其他所有内容。