UITextView
でSwift
のデータの変化を検出するにはどうすればよいですか?次のコードは検出を行いません。
私はUITextView
を宣言しています:
@IBOutlet weak var bodyText: UITextView!
optional func textViewDidChange(_ textView: UITextView!) {
println(bodyText.text)
}
ありがとうスコット
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
}
}
Swift 4:
func textViewDidChange(_ textView: UITextView) {
// Your code here
}
私の場合、実装を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)?
}