2017-04-11 25 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 –