In ios6 verursacht das Festlegen des Delegierten-Objekts "GestenRecognizers" von pageViewController für einen viewController einen Absturz

8

Dies hat erst mit ios6 begonnen, aber wenn Sie ein neues Projekt mit der Seitenansicht-Controller-Vorlage starten. Dann in

%Vor%

füge die Zeilen am Ende der Methode hinzu.

%Vor%

Sie müssen den viewController so zuweisen, dass er dem UIGestureRecognizerDelegate entspricht, und die Methode

implementieren %Vor%

Wenn Sie nun die App starten und versuchen, die Seite über die Grenzen hinaus zu drehen, gehen Sie zum Januar und versuchen Sie, so zurück zu kehren

  • (UIViewController *) pageViewController: (UIPageViewController *) pageViewController viewControllerBeforeViewController: (UIViewController *) viewController

gibt nil zurück.

Die App wird dann abstürzen.

Dies ist bei ios5 nicht passiert. Ich muss den GestenRecognizer-Delegaten meinem viewController zuweisen, weil ich nicht immer möchte, dass der PageViewController die Berührungsereignisse behandelt.

Hat irgendjemand anderes dies erfahren oder darauf hingewiesen, wenn ich etwas falsch mache?

Vielen Dank Stewart.

    
noRema 24.09.2012, 08:27
quelle

4 Antworten

8

Endlich eine Lösung für mein Problem gefunden, die mich traurig gemacht hat, hoffentlich kann das jemand anderem helfen.

Das Problem tritt auf, wenn Sie den PageViewControllers-Delegaten auf Ihren viewController

setzen %Vor%

gibt dann nil von

zurück %Vor%

wird abstürzen !! nur in iOS6 !!

Mein Problem war, dass ich den Delegierten der Gestenerkennung einstellen musste, weil ich in einigen Situationen die pangGeschichte abfangen musste, dh dem Benutzer nicht erlaubte, eine Seite zu drehen, um bestimmte Teile davon aufgrund einiger Knöpfe zu berühren.

Die Lösung besteht darin, die Logik aus

zu setzen %Vor%

in

%Vor%

Denn solange wir NO zurückgeben, wird es nicht weiter

aufrufen %Vor%

und so keine Notwendigkeit, Null zurückgeben und einen Absturz bekommen.

Dies funktionierte jedoch nicht auf der ersten und letzten Seite in der Sequenz. Auf der ersten Seite möchten Sie beispielsweise zulassen, dass die Seite vorwärts, aber nicht zurück gedreht wird. Also dachte ich darüber nach, den GestureRecogniser zu betrachten, ihn in eine PanGesture zu übertragen und dann die Geschwindigkeit zu überprüfen, wenn die Geschwindigkeit ein Zurückdrehen bedeutet (& gt; 0.0f), dann gebe einfach NO zurück. Das klang gut, aber die Geschwindigkeit war immer Null.

Ich fand dann eine sehr hilfreiche kleine Funktion auf dem GestureRecognizer-Delegaten mit dem Namen:

%Vor%

Diese Funktion wird nach

aufgerufen %Vor%

aber diesmal ist die Geschwindigkeit von der Geste wie erwartet, also kann ich die Geschwindigkeit überprüfen und gebe nur JA für die erste Seite zurück, wenn es & gt; 0.0f

    
noRema 27.09.2012, 16:27
quelle
7

Ich glaube, ich habe eine Lösung gefunden, die viel weniger verworren ist als das Refactoring irgendeines vorhandenen pageViewController-Codes, wie noRema erwähnt wurde, oder Verwirrung mit der Selector-Weiterleitung, wie erwähnt hier , obwohl ich es nie ohne diese beiden Lösungen als Referenz gefunden hätte.

Dies sollte leicht in jedes UIPageViewController-Projekt mit nur geringen Anpassungen fallen.

Um zu implementieren, lassen Sie Ihren Code wie er ist; Die gesamte vorhandene Logik sollte beibehalten werden, da dies nur das Verhalten des UIGestureRecognizer-Delegierten beeinflusst. Überschreiben Sie die Geste Delegate-Methode - (BOOL) GestenRecognizerShouldBegin: mit etwas wie folgt:

HINWEIS: Ich verwende den seitenbasierten Anwendungscode von Apple als Ausgangspunkt. Beziehen Sie sich darauf, wenn die Begriffe _modelController und _pageViewController Verwirrung stiften.

%Vor%     
jankins 04.10.2012 18:41
quelle
4

Bei der Untersuchung des Problems mit der Pan-Geste in UIPageViewController unter iOS 6 habe ich festgestellt, dass es in einer Geste mehrere Male vor / nach View-Controller-Methoden aufrufen kann. Das ist in meinem speziellen Fall schlecht, da ich warten muss, bis die Animation für jede Seitendrehung beendet ist, um zur nächsten / vorherigen Seite zu navigieren. So haben unsere Methoden eine solche Struktur:

%Vor%

Gleiches gilt für viewControllerAfterViewController Methode.

Und nach Beendigung der Animation wird diese Methode von UIPageViewControllerDelegate aufgerufen:

%Vor%

Da PanGesture mehrmals aufgerufen wurde, wurde viewControllerAfterViewController und eine andere Methode mehrmals aufgerufen, und unglücklicherweise wurde didFinishAnimating Methode in diesem Fall nicht aufgerufen, was dazu führte, dass animationInProgress Flag auf YES gesetzt wurde. immer und der Benutzer konnte überhaupt nicht durch die Seiten navigieren. Hinweis: geschieht nur in iOS 6.

Um dieses Problem zu beheben, mussten wir irgendwie mit PanGesture umgehen. Die Verwendung von UIView gestureRecognizerShouldBegin:gestureRecognizer (die in iOS 6 hinzugefügt wurde) löste überhaupt kein Problem. Wenn Controller als Delegat für Gesten gesetzt wurde, führte dies zu Abstürzen, wenn nil von Vorher-Nachher-Methoden zurückgegeben wurde. Daher haben wir versucht, Logiken hinzuzufügen, um keine Vorher- / Nachher-Controller-Methoden aufzurufen, wenn PanGesture in UIGestureRecognizerStateChanged state ist (das wurde anhand einiger Tests untersucht, um zu bestimmen, welcher Gestenstatus Methoden in loop aufruft).

Durch Hinzufügen einer Methode wie:

%Vor%

Danach sehen die Methoden folgendermaßen aus:

%Vor%

Dies half beim Lösen des Schleifenproblems mit animationInProgress flag.

Ich hoffe, dass dies für jemanden hilfreich sein wird.

    
Sergii N. 26.11.2012 09:35
quelle
2

Ich hatte das gleiche Problem mit UIPageViewController Absturz mit iOS6 mit dem gleichen Fehler beim Navigieren über die Grenzen.

Keine der obigen Lösungen funktionierte für mich, aber ich fand schließlich heraus, dass das Verschieben der folgenden Zeile von viewDidLoad nach viewDidAppear es vollständig reparierte.

%Vor%     
Liam 19.11.2012 17:21
quelle

Tags und Links