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

Когда пользователь нажимает клавишу [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 && 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

}

person Lydia    schedule 10.10.2016    source источник
comment
Покажите нам, что вы пробовали.   -  person Nirav D    schedule 10.10.2016
comment
@NiravD обновлено. спасибо   -  person Lydia    schedule 10.10.2016


Ответы (1)


Объявите одну переменную Int для номера текущей строки и используйте ее внутри 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 && !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 && 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
}
person Nirav D    schedule 10.10.2016
comment
Спасибо. Но этот код не обрабатывает backspace. Если мы нажмем backspace, даже увеличим число - person Lydia; 10.10.2016
comment
@Lydia Проверьте отредактированный ответ на предмет уменьшения номера строки при удалении. - person Nirav D; 10.10.2016
comment
Работал отлично. Он также обрабатывает редактирование предыдущего текста. - person Lydia; 11.10.2016
comment
Добро пожаловать дружище :) - person Nirav D; 11.10.2016