Swift3 在UITextView Swift 3中创建编号列表

Swift3 在UITextView Swift 3中创建编号列表,swift3,xcode8,Swift3,Xcode8,我试图将用户输入到UITextView的信息制作一个编号列表。比如说, 第一项 清单项目二 清单项目三 这是我尝试过的代码,但没有给我想要的效果。 var currentLine:Int=1 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { // Add "1" when the user starts ty

我试图将用户输入到UITextView的信息制作一个编号列表。比如说,

  • 第一项
  • 清单项目二
  • 清单项目三
  • 这是我尝试过的代码,但没有给我想要的效果。 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
    }
    
    正如这里所说的:但是没有成功


    非常感谢您的帮助。

    您可以将UITextView子类化,重写方法willMove(toSuperview),并为UITextViewTextDidChange添加一个观察者,使用选择器将文本拆分为行,并相应地对其进行枚举和编号。请尝试以下操作:

    class NumberedTextView: UITextView {
        override func willMove(toSuperview newSuperview: UIView?) {
            frame = newSuperview?.frame.insetBy(dx: 50, dy: 80) ?? frame
            backgroundColor = .lightGray
            NotificationCenter.default.addObserver(self, selector: #selector(textViewDidChange), name: .UITextViewTextDidChange, object: nil)
        }
        func textViewDidChange(notification: Notification) {
            var lines: [String] = []
            for (index, line) in text.components(separatedBy: .newlines).enumerated() {
                if !line.hasPrefix("\(index.advanced(by: 1))") &&
                    !line.trimmingCharacters(in: .whitespaces).isEmpty {
                    lines.append("\(index.advanced(by: 1)). " + line)
                } else {
                    lines.append(line)
                }
            }
            text = lines.joined(separator: "\n")
            // this prevents two empty lines at the bottom
            if text.hasSuffix("\n\n") {   
                text = String(text.characters.dropLast())
            }
        }
    }
    


    您可以将UITextView子类化,覆盖方法willMove(toSuperview),并为UITextViewTextDidChange添加一个观察者,该观察者使用一个选择器将文本拆分为行,并相应地枚举和编号。请尝试以下操作:

    class NumberedTextView: UITextView {
        override func willMove(toSuperview newSuperview: UIView?) {
            frame = newSuperview?.frame.insetBy(dx: 50, dy: 80) ?? frame
            backgroundColor = .lightGray
            NotificationCenter.default.addObserver(self, selector: #selector(textViewDidChange), name: .UITextViewTextDidChange, object: nil)
        }
        func textViewDidChange(notification: Notification) {
            var lines: [String] = []
            for (index, line) in text.components(separatedBy: .newlines).enumerated() {
                if !line.hasPrefix("\(index.advanced(by: 1))") &&
                    !line.trimmingCharacters(in: .whitespaces).isEmpty {
                    lines.append("\(index.advanced(by: 1)). " + line)
                } else {
                    lines.append(line)
                }
            }
            text = lines.joined(separator: "\n")
            // this prevents two empty lines at the bottom
            if text.hasSuffix("\n\n") {   
                text = String(text.characters.dropLast())
            }
        }
    }
    


    哥们,非常感谢。我甚至没有想到这种方法。你太棒了!我只是尝试在一个新应用程序中实现这一点,以及一个项目列表,但两个都不起作用。请你检查一下。哥们,非常感谢。我甚至没有想到这种方法。你太棒了!我只是尝试在一个新应用程序中实现这一点,以及一个b没有列出清单,但两个都不起作用。你能检查一下吗。