Как сделать автоматическую нумерацию в UITextView при нажатии клавиши возврата в swift

#swift #uitextview #swift3 #autonumber #sequential-number

#swift #uitextview #swift3 #автоматическая нумерация #последовательный номер

Вопрос:

Когда пользователь нажимает клавишу [Return], необходимо отобразить номер. Например, серийные номера [1,2 и т.д.] для каждой строки.Есть ли какой-нибудь способ сделать это?

Следующий код, который я попробовал

  func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

    var textview_text_nssring = textView.text as NSString




    // Add "1" when the user starts typing into the text field


    if  (range.location == 0 amp;amp; textView.text.isEmpty ) {


        if text == "n" {

            textView.text = "1."

            let cursor = NSMakeRange(range.location   3, 0)
            textView.selectedRange = cursor
            return false
        }

        else {

            textView.text = NSString(format: "1. %@", text) as String
        }


    }




 return true

}
  

Комментарии:

1. Покажите нам, что вы попробовали.

2. Обновлено @NiravD. Спасибо

Ответ №1:

Объявите один Int var для текущего номера строки и используйте его внутри shouldChangeTextIn range таким образом.

 var currentLine: Int = 1 

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    // Add "1" when the user starts typing into the text field
    if  (textView.text.isEmpty amp;amp; !text.isEmpty) {
        textView.text = "(currentLine). "
        currentLine  = 1
    }
    else {
        if text.isEmpty {
            if textView.text.characters.count >= 4 {
                let str = textView.text.substring(from:textView.text.index(textView.text.endIndex, offsetBy: -4))
                if str.hasPrefix("n") {
                    textView.text = String(textView.text.characters.dropLast(3))
                    currentLine -= 1
                }
            }
            else if text.isEmpty amp;amp; textView.text.characters.count == 3 {
                textView.text = String(textView.text.characters.dropLast(3))
                currentLine = 1
            }
        }
        else {
            let str = textView.text.substring(from:textView.text.index(textView.text.endIndex, offsetBy: -1))
            if str == "n" {
                textView.text = "(textView.text!)(currentLine). "
                currentLine  = 1
            }
        }

    }
    return true
}
  

Комментарии:

1. Спасибо. Но этот код не обрабатывает пробел. Если мы нажмем пробел, даже увеличим число

2. @Lydia Проверьте отредактированный ответ на уменьшение номера строки при удалении.

3. Сработало отлично. Он также обрабатывает редактирование предыдущего текста

4. Добро пожаловать, приятель 🙂

5. Я использовал приведенный выше код, но он не работает для меня в Swift 5, только что получил первый (1. text) после того, как приращение не работает