【问题标题】:Creating A Numbered List In UITextView Swift 3在 UITextView Swift 3 中创建编号列表
【发布时间】:2017-04-11 21:23:48
【问题描述】:

我正在尝试从用户输入到 UITextView 的信息中创建一个编号列表。例如,

  1. 列出第一项
  2. 列出第二项
  3. 列出第三项

这是我尝试过但没有给我想要的效果的代码。 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
}

这里建议:How to make auto numbering on UITextview when press return key in swift 但没有成功。

非常感谢任何帮助。

【问题讨论】:

    标签: swift3 xcode8


    【解决方案1】:

    您可以继承 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())
            }
        }
    }
    

    import UIKit
    
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            let textView = NumberedTextView()
            view.addSubview(textView)
        }
    }
    

    【讨论】:

    • 老兄,非常感谢。我什至没有想到这样做的方式。你摇滚!
    • 我只是尝试将它实现到一个新的应用程序中,以及一个项目符号列表,但都没有工作。请你检查一下。 stackoverflow.com/q/45869927/7513942?sem=2
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多