Замена символа после каждого типа в UITextField?
У меня есть UITextField, в котором пользователь должен ввести предложение, которое мы говорим пользователю, чтобы напечатать. Так что предложение типа уже известно нам. На полпути предложения пользователь должен тайно передать сообщение. Чтобы сделать это, введите несколько букв уже известного предложения, а затем введите "&", а затем WhichEverMessageUserWantsToPass и "&" в конце.
Подвох - это момент, когда пользователь нажимает "&", после чего все, что он печатает, не должно отображаться, вместо этого каждая буква, которую он вводит после этого, должна быть заменена буквой в уже известном предложении.
Например:
String - В каком городе я жил 2 года назад?
Типы пользователей - Какой город ди & Детеройн и 2 года
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
}
Тем не менее, это, кажется, не заменяет ни одной буквы в настоящее время Пожалуйста, помогите, если кто-нибудь знает реализацию. Спасибо
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..<3 на мой
заменил бы 6..<9 на sti
заменит 11..<14 на
И текст, отображаемый в текстовом поле "my ghjsti ui to.." (жирный текст - это тот, который читается из фактического вопроса и соответствует разделам &X& ввода).
Примечание: для быстрой замены 1 замените []
с nil
,
Во время редактирования текстового поля , если вы хотите заменить символы
@IBAction func editingChanged(_ sender: UITextField) {
sender.text = sender.text?.replacingOccurrences(of: ".", with: "")
}