Edit: Meine Lösung unten war das erste, was im Auge zu kommen und drehte sich vielmehr Hacky zu sein und unsicher sein könnte, falls die Verwendung von Apple die Interna der UIScrollView
Klasse zu ändern entscheidet. Siehe die answer von Mazyod vorgeschlagenen, die sicherer und einfacher sein sollte.
Dies ist abhängig von der Implementierung und kann von Apple in Zukunft iOS-Updates, aber derzeit UIScrollView
Klasse scheint, sich auf Geste Erkenner für die Verwaltung von Benutzer-Interaktion und UITableView
sind eine Unterklasse der Scroll-Ansichtsklasse macht das gleiche geändert werden .
Wenn Sie UIScrollView.h des UIKit Rahmen gehen, können Sie einen verdächtigen _pan
Ivar bemerken, die einen id
Typen hat, scheinen aber tatsächlich ein UIPanGestureRecognizer
zu sein.
Also habe ich das versucht, und es scheint zu funktionieren.
[_tableView addObserver: self
forKeyPath: @"pan.state"
options: NSKeyValueObservingOptionNew
context: nil];
Wenn die View-Tabelle ziehen, state
des Gestenerkenner ändert sich mehrmals, und wenn Sie mit dem Ziehen aufhören, state
erhält seine letzte Änderung auf den Wert von UIGestureRecognizerStateEnded
.
Bitte beachten Sie, dass, obwohl dies den Trick zu tun scheint, ein anderes Problem in Ihrem Weg stehen könnte. Es ist im Allgemeinen keine gute Idee, vorhandene Klassenmethoden in einer Kategorie zu überschreiben, da die ursprüngliche Implementierung danach nicht mehr zugänglich ist. Dokumentation auf der NSKeyValueObserving
informellen Protokoll besagt, dass
NSObject eine Implementierung des NSKeyValueObserving Protokoll bereitstellt, die eine automatische Beobachtungsfähigkeit für alle Objekte zur Verfügung stellt.
Also, wenn Sie observeValueForKeyPath:ofObject:change:context:
in einer Kategorie außer Kraft setzen, wird die Standardimplementierung nicht zugegriffen werden (und wir können nicht sicher sein, dass UITableView
oder UIScrollView
nicht Benutzer KVO für etwas). Das kann einige unerwartete Fehler verursachen.
Wie, wenn ich "observeValueForKeyPath: ofObject: change: context:" implementieren in einigen Klassen "Foo" und UITableView eine Instanz von Foo behalten? – OpenThread
Danke für Hilfe! Ihre Antwort ist sehr hilfreich für mich! – OpenThread
Das Implementieren von 'observeValueForKeyPath: ofObject: change: context:' in einer separaten Foo-Klasse sollte in der Tat beim Überschreiben der vorhandenen Methode in einer Kategorie helfen. –