- KVO-Lösungen nicht funktionieren
KVO funktioniert NICHT in iOS für Steuerungen: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html
- In der beobachtenden Klasse tun Sie dies:
Sie kennen die Textansicht, die Sie sehen möchten:
var watchedTextView: UITextView!
Tun Sie dies:
NotificationCenter.default.addObserver(
self,
selector: #selector(changed),
name: UITextView.textDidChangeNotification,
object: watchedTextView)
Aber seien Sie vorsichtig damit:
-
ist es wahrscheinlich, dass Sie nur das aufrufen wollen einmal Rufen Sie also nicht an, zum Beispiel, layoutSubviews
-
Es ist ziemlich schwierig zu wissen, wann man ihn während des Aufbauprozesses am besten anruft. Das hängt von Ihrer Situation ab. Leider gibt es keine standardisierte, feststehende Lösung
-
zum Beispiel können Sie in der Regel sicher pas rufen sie an init
Zeit, denn natürlich watchedTextView
darf noch nicht existieren
.
- das nächste Problem ist, dass ...
Keine der Benachrichtigungen werden aufgerufen, wenn der Text geändert wird programmatisch .
Dies ist ein riesiges, uraltes und dummes Ärgernis in der iOS-Technik.
Kontrolliert einfach nicht tun - Ende der Geschichte - die Benachrichtigungen aufrufen, wenn die Eigenschaft .text programmatisch geändert wird.
Das ist wahnsinnig ärgerlich, denn natürlich setzt jede App, die jemals entwickelt wurde, den Text programmatisch, z. B. indem sie das Feld löscht, nachdem der Benutzer einen Beitrag geschrieben hat, usw.
Sie müssen die Textansicht (oder ein ähnliches Steuerelement) wie folgt untergliedern:
class NonIdioticTextView: UIITextView {
override var text: String! {
// boilerplate code needed to make watchers work properly:
get {
return super.text
}
set {
super.text = newValue
NotificationCenter.default.post(
name: UITextView.textDidChangeNotification,
object: self)
}
}
}
(Tipp - vergessen Sie nicht, dass der Superanruf kommen muss vor ! der Postaufruf).
Dort ist keine Lösung zur Verfügung, es sei denn, Sie beheben das Steuerelement durch Unterklassifizierung, wie gerade oben gezeigt. Das ist die seulement Lösung.
Beachten Sie, dass die Meldung
UITextView.textDidChangeNotification
führt zu
func textViewDidChangeSelection(_ textView: UITextView)
angerufen werden.
( Nicht textViewDidChange
.)