Замена символа после каждого типа в UITextField?

У меня есть UITextField, в котором пользователь должен ввести предложение, которое мы просим пользователя ввести. Итак, предложение напечатать нам уже известно. В середине предложения пользователь должен тайно передать сообщение. Это можно сделать, набрав несколько букв уже известного предложения, а затем набрав «&», а затем «WhatEverMessageUserWantsToPass» и «&» в конце.

Подвох заключается в том, что в тот момент, когда пользователь нажимает «&», все, что он вводит после этого, не должно отображаться, вместо этого каждая буква, которую он вводит после этого, должна быть заменена буквой в уже известном предложении.

Например:

Строка - В каком городе я жил 2 года назад?

Типы пользователей - Какой город di&Deteroit&n 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
}

Однако в настоящее время это, похоже, не заменяет никакую букву. Пожалуйста, помогите, если кто-нибудь знает реализацию. Спасибо


person Mehul    schedule 19.07.2015    source источник
comment
Из вашего примера данных ОЧЕНЬ неясно, что вы пытаетесь сделать, очень неясно - я понятия не имею, как связаны ввод и вывод. Вы заменяете одни строки другими, что-то опускаете, что-то вставляете и тадаааа, что-то должно получиться.   -  person luk2302    schedule 19.07.2015
comment
Привет @ luk2303, я надеюсь, что это лучше. Пожалуйста, не стесняйтесь сказать мне, если это все еще неясно. Прошу прощения или двусмысленность.   -  person Mehul    schedule 19.07.2015
comment
Это на самом деле проясняет это, позвольте мне немного закодировать;)   -  person luk2302    schedule 19.07.2015
comment
Спасибо. С нетерпением жду вашего ответа. :).   -  person Mehul    schedule 19.07.2015


Ответы (1)


Ну вот - попробуй!

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 на my
заменит 6..‹9 на sti
заменит 11..‹14 на to

И текст, отображаемый в текстовом поле «my ghjstiui to..» (жирный текст читается из фактический вопрос и соответствует разделам &X& ввода.)

Примечание: для быстрого доступа 1 замените [] на nil.

person luk2302    schedule 19.07.2015
comment
Я действительно восхищаюсь вашими усилиями. Просто в тот момент, когда я вставляю этот код, возникает ошибка в первой строке цикла while true, т.е. если let firstIndex = ... Ошибка: невозможно вызвать rangOfString со списком аргументов типа (String, options:NSArray,range:Range‹ String.Index›, язык: ноль) - person Mehul; 19.07.2015
comment
@Mehul Mehul Хммм, какую версию Swift вы используете? У меня вроде работает, могу проверить на симуляторе. - person luk2302; 19.07.2015
comment
@Mehul yeiks:/ это быстрый 1.1??? Я использую 1.2. Попробуйте заменить [] на nil и посмотрите, исправит ли это ошибку. - person luk2302; 19.07.2015
comment
@Mehul попробуйте ввести xcrun swift --version в терминале и скажите мне, какая версия подходит - я не понимаю, какая версия xcode поставляется с каким быстрым - person luk2302; 19.07.2015
comment
Да, замена [ ] на nil устранила ошибку. Теперь пробуем код. Я действительно надеюсь стать таким же опытным, как ты, мужик! Проверим код и сообщим вам. Спасибо. - person Mehul; 19.07.2015
comment
Работает как шарм. Спасибо!! - person Mehul; 19.07.2015
comment
@Mehul, пожалуйста. Забавно то, что я никогда не учился быстро программировать, просто так получилось... :D Я еще не использовал его в своем первом собственном проекте... - person luk2302; 19.07.2015
comment
Давайте продолжим обсуждение в чате. - person Mehul; 19.07.2015
comment
Стоит отметить, что возврат false в этом методе предотвращает срабатывание UIControlEvents. Поэтому, если вы зависите от чего-то вроде .EditingChanged, вам нужно иметь способ запустить их самостоятельно. - person Tyten; 31.10.2016