swiftuitextviewswift3autonumbersequential-number

How to make auto numbering on UITextview when press return key in swift


When user press [Return] key then need to display the number. Like serial numbers [1,2 etc] for each line.Is there any way to do that?

Following code I tried

 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

}

Solution

  • Declare one Int var for current line number and use it inside shouldChangeTextIn range like this way.

    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
    }