web-dev-qa-db-ja.com

UITextViewデータの変更swift

UITextViewSwiftのデータの変化を検出するにはどうすればよいですか?次のコードは検出を行いません。

私はUITextViewを宣言しています:

@IBOutlet weak var bodyText: UITextView!

optional func textViewDidChange(_ textView: UITextView!) {
    println(bodyText.text)
}

ありがとうスコット

36
user3896519

UITextView delegate を設定し、その中に textViewDidChange: メソッドを実装する必要があります。残念ながら、Swiftドキュメントがオンラインで利用可能かどうかはわかりません。すべてのリンクはObjective-Cドキュメントに移動します。

コードは次のようになります:(updated for Swift 4.2))

class ViewController: UIViewController, UITextViewDelegate { //If your class is not conforms to the UITextViewDelegate protocol you will not be able to set it as delegate to UITextView

    @IBOutlet weak var bodyText: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        bodyText.delegate = self //Without setting the delegate you won't be able to track UITextView events
    }

    func textViewDidChange(_ textView: UITextView) { //Handle the text changes here
        print(textView.text); //the textView parameter is the textView where text was changed
    }
}
88
Sergey Pekar

delegateUITextViewを設定します。Refer ITextViewDelegate

viewDidLoadにこれを書いてください

bodyText!.delegate = self
5
codester

Swift 4:

func textViewDidChange(_ textView: UITextView) {
  // Your code here
}
2
Andy

私の場合、実装をUIViewControllerから独立させたいので、テキストの変更のためだけにデリゲートを割り当てる必要はありません。または、UITextViewに何らかの検証があり、多くの複雑なロジックを管理するデリゲートの代わりに、フィールドごとに検証することもできます。

UITextViewをサブクラス化する必要がありますが、非常に価値があります:

class TextView: UITextView {

    convenience init() {
        self.init(frame: CGRect.zero, textContainer: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(textDidChangeNotification), name: UITextView.textDidChangeNotification , object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func textDidChangeNotification(_ notif: Notification) {
        guard self == notif.object as? UITextView else {
            return
        }
        textDidChange()
    }

    func textDidChange() {
        // the text in the textview just changed, below goes the code for whatever you need to do given this event

        // or you can just set the textDidChangeHandler closure to execute every time the text changes, useful if you want to keep logic out of the class
        textDidChangeHandler?()
    }

    var textDidChangeHandler: (()->Void)?

}
2
Lucas Chwe