Edit: poniżej Moje rozwiązanie było pierwszą rzeczą, aby przyjść na uwadze i okazał się być dość hacky i może być niebezpieczne w użyciu w przypadku firmy Apple zdecyduje się zmienić wewnętrzne klasy UIScrollView
. Zobacz propozycję answer zaproponowaną przez Mazyod, która powinna być bezpieczniejsza i bardziej prosta.
To jest zależna od implementacji i mogą być zmieniane przez Apple w przyszłych aktualizacjach iOS, ale obecnie UIScrollView
klasa wydaje się polegać na Recognizers gest za zarządzanie interakcji użytkownika i UITableView
jest podklasą klasy widoku przewijania robi to samo .
Jeśli pójdziesz do UIScrollView.h ram UIKit można zauważyć podejrzaną _pan
ivar która ma typ id
, ale wydaje się być rzeczywiście UIPanGestureRecognizer
.
Próbowałem tego i wydaje się, że działa.
[_tableView addObserver: self
forKeyPath: @"pan.state"
options: NSKeyValueObservingOptionNew
context: nil];
Podczas przeciągania widoku tabeli, state
z rozpoznawania gestów zmienia się kilka razy, a kiedy przestać przeciągania state
otrzymuje swoją ostatnią zmianę do wartości UIGestureRecognizerStateEnded
.
Należy pamiętać, że chociaż wydaje się, że to wystarczy, to jednak na przeszkodzie może stanąć inny problem. Generalnie nie jest dobrym pomysłem zastąpienie istniejących metod klasy w kategorii, ponieważ pierwotna implementacja staje się później niedostępna. Dokumentacja na nieformalnym protokołu NSKeyValueObserving
stwierdza, że
NSObject zapewnia implementację protokołu NSKeyValueObserving który zapewnia automatyczną zdolność obserwacji dla wszystkich obiektów.
Więc jeśli przesłonić observeValueForKeyPath:ofObject:change:context:
w kategorii domyślna implementacja będzie niedostępne (i nie możemy być pewni, że UITableView
lub UIScrollView
nie KVO użytkownika za coś). Może to spowodować nieoczekiwane błędy.
Jak wdrożyć 'observeValueForKeyPath: ofObject: change: context:' w niektórych klasach 'Foo', a kategoria UITableView zachować instancję Foo? – OpenThread
Dzięki za pomoc! Twoja odpowiedź jest dla mnie pomocna! – OpenThread
Implementacja 'observeValueForKeyPath: ofObject: change: context:' w oddzielnej klasie Foo powinna rzeczywiście pomóc w rozwiązaniu problemu "nadpisując istniejącą metodę w kategorii". –