我有一个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
}
然而,这似乎并没有取代目前的任何信件。如果有人知道实施,请帮助。谢谢
答案 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
。