2013-02-11 12 views
5

Ich muss benachrichtigt werden, wenn ein UITableView 's Drag zu einem Ende gekommen ist.Wie erkennt man das Ende-Ereignis eines UITableView?

Aber ich arbeite an einer UITableView-Kategorie, so kann ich scrollViewDidEndDragging:willDecelerate: nicht verwenden, um dies zu archivieren.

habe ich versucht, den Einsatz KVO auf dragging Schlüsselpfad zu beachten:

[self addObserver:self forKeyPath:@"dragging" options:NSKeyValueObservingOptionNew context:nil]; 

Aber observeValueForKeyPath:ofObject:change:context: nicht genannt hat da UITableView.dragging hat und Setter nicht und diese Eigenschaft ist mit KVO nicht konform.

Gibt es eine andere Methode zum Archivieren dieses erwartet für die Verwendung scrollViewDidEndDragging:willDecelerate:?

Jede Hilfe ist dankbar! Vielen Dank!

Antwort

8

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.

+0

Wie, wenn ich "observeValueForKeyPath: ofObject: change: context:" implementieren in einigen Klassen "Foo" und UITableView eine Instanz von Foo behalten? – OpenThread

+0

Danke für Hilfe! Ihre Antwort ist sehr hilfreich für mich! – OpenThread

+1

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. –

8

Die Antwort von Egor Chiglintsev erinnerte mich an die panGestureRecognizer Eigenschaft, die bereits in UIScrollView freigelegt wurde. Es sollte viel sicherer sein als pan. Aber dann .. Ich habe herausgefunden, dass ich mich selbst als Ziel hinzufügen kann!

[_scrollView.panGestureRecognizer addTarget:self action:@selector(gestureRecognizerUpdate:)]; 

Das funktioniert gut für mich!

+1

Ich denke, das ist der richtige Weg, es sollte wirklich getan werden. Ich weiß nicht, warum die ersten Dinge, die mir in den Sinn kommen, normalerweise Runtime- oder KVO-bezogene Hacks sind. Vielen Dank) –

Verwandte Themen