在UITextField中替换每种类型后的字符?

时间:2015-07-19 14:15:46

标签: ios swift uitextfield uitextinput

我有一个UITextField,用户需要输入一个我们告诉用户输入的句子。因此,我们已经知道要输入的句子。在句子的中途,用户必须秘密传递消息。这样做的方法是输入已知句子的几个字母,然后键入'&'其次是WhichEverMessageUserWantsToPass和'&'结束

抓住是用户按下''的那一刻,不管他输入什么,不应该显示,而是他之后输入的每个字母都应该用已知句子中的字母替换

例如:

  

字符串 - 我在2年前住过哪个城市?

     

用户类型 - 哪个城市di& Deteroit& n 2 yea

     

UITextField应该显示 - 我住在哪个城市2年

两者之间的部分'&'本质上是答案,所以我不希望它在文本字段中显示。

我目前的做法是:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    var addString = String(self.character[self.textLength])

    var start = textField.text.endIndex // Start at the string's end index as I only want the most recent character to be replaced
    var end = textField.text.endIndex // Take the string's end index as I only want one character to be changes per type
    var nextRange: Range<String.Index> = Range<String.Index>(start: start,end: end)

    textField.text.stringByReplacingCharactersInRange(nextRange, withString: addString)


    return true
}

然而,这似乎并没有取代目前的任何信件。如果有人知道实施,请帮助。谢谢

1 个答案:

答案 0 :(得分:2)

你去吧 - 尝试一下!

let initialString = "my question to be answered"
var inputString = NSString()

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    inputString = inputString.stringByReplacingCharactersInRange(range, withString: string)

    textField.text = inputString as String
    var range = Range<String.Index>(start: (textField.text?.startIndex)!,end: (textField.text?.endIndex)!)

    while true {
        if let firstIndex = textField.text!.rangeOfString("&", options: [], range: range, locale: nil) {
            range = Range<String.Index>(start: firstIndex.startIndex.successor(), end: (textField.text?.endIndex)!)
            var endIndex : String.Index?
            if let index = textField.text!.rangeOfString("&", options: [], range: range, locale: nil) {
                endIndex = index.endIndex
                range = Range<String.Index>(start: index.startIndex.successor(), end: (textField.text?.endIndex)!)
            } else {
                endIndex = textField.text?.endIndex
            }

            let relevantRange = Range(start: firstIndex.startIndex,end: endIndex!)
            let repl = initialString.substringWithRange(relevantRange)

            print("would replace the \(relevantRange) with \(repl)")

            textField.text!.replaceRange(relevantRange, with: repl)
        } else {
            break
        }
    }
    return false
}

我认为这几乎就是你想要的加上非常干净,你可以删除或添加&中句,一切都可以正常工作。

"&X&ghj&X&ui&X&.."输入的示例输出将是

  

将用我的替换0 ..&lt; 3   用sti替换6 ..&lt; 9   将取代11 ..&lt; 14 with to

文本字段中显示的文字&#34; 我的 ghj sti ui ..&#34; (粗体文本是从实际问题中读取的文本,与输入的&amp; X&amp;部分相匹配。)

注意:对于swift 1,将[]替换为nil