2015-10-05 126 views
0

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

我试过以下。

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,但如预期,要么没有工作。

我有以下类型的字符串:“有______红色的花,______绿色的花和______黄色的花”,其中“____”以外的所有内容都是不可变的范围。

+1

为什么范围重叠? – rmaddy

+0

范围不是“真实的”只是一个例子。删除,以防止混淆。 – LucasNielsen

+0

您的'if'语句正在检查范围内的完全匹配。你需要看看'changeRange'和'range'是否重叠。 – rmaddy

回答

1

您对每个范围的检查都不正确。而不是看到如果每个范围等于,你需要检查,如果每个区域相交:

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

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

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

+0

谢谢你的解决方案。 – LucasNielsen

+0

你的'if'条件应该在'overlap'上。 – Abhinav

+0

@Abhinav谢谢。这是一个错字。固定。 – rmaddy