2017-04-11 27 views
0

我想从用户输入到UITextView的信息中编制一个编号列表。例如,在UITextView中创建一个编号列表Swift 3

  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但没有成功。

任何帮助,非常感谢。

回答

0

你也可以继承的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) 
    } 
} 
+0

老兄,非常感谢你,我甚至没有想到这样做,你摇滚! –

+0

@JacobE欢迎你 –

+0

我只是试图实现这个到一个新的应用程序,以及项目符号列表和一件工作,请你检查一下s://stackoverflow.com/q/45869927/7513942?sem = 2 –