Cómo se puede detectar un cambio de datos en un UITextView con Swift? El siguiente código no hace ningún tipo de detección.

Estoy declarando la UITextView :

@IBOutlet weak var bodyText: UITextView!

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

Gracias
Scott

InformationsquelleAutor user3896519 | 2014-07-31

4 Comentarios

  1. 85

    Que usted necesita para establecer UITextView delegado y aplicar textViewDidChange: método en ella. Por desgracia, yo no sé si swift documentación está disponible en línea. Todos los enlaces de ir a la objective-c de la documentación.

    El código se verá así: (actualizado para 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
        }
    }
    • ¿Este método se llama cuando el valor de texto de los cambios, o también de responder a los cambios en la atribuye propiedad de texto (negrita/cursiva/etc)?
    • No lo he probado. Pero parece que el método va a responder cualquier cambio en el texto
  2. 2

    Para mi caso, yo quería que la implementación sea independiente de un UIViewController, así que no es necesario asignar un delegado sólo para el texto de los cambios. O incluso tal vez hay algún tipo de validación en el UITextView, y te dan ganas de contener al campo en lugar de delegar la gestión de una lógica muy complicada.

    Que se requiere para la subclase UITextView, pero su muy mucho la pena omi:

    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)?
    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here