performSegueWithIdentifier sehr langsam, wenn segue modal
Habe ich eine einfache Tabelle gesehen, wo ich mit der select-Aktion auf der Tabelle ansehen. Diese Aktion folgt eine überleitung.
Wenn die segue ist eine push
segue, die nächste Ansicht zeigt sofort.
Wenn die segue ist eine modal
segue, den nächsten Blick:
- dauert 6 Sekunden oder so, um die Anzeige
- zeigt sofort, wenn ich Tippen Sie erneut (zweiter tap)
Ich habe versucht, auf der Suche rund um für einige Ideen, aber keiner scheint für meine situation. Insbesondere:
- Ich bin der Durchführung der übergang auf die Haupt-UI-thread
- Meine Ansicht ist sehr einfach (es gibt also kein Problem in
viewDidLoad
). Plus die Tatsache, dass es zeigt sich in der Nähe sofortige, wenn der übergang istpush
bedeutet, dass es keine problem beim laden der target-Ansicht - Ich versucht vorbei
nil
zu densender
; gleiche Wirkung.
Hat jemand irgendwelche Ideen dazu?
- welchen code hast du in der nächsten Ansicht? Zum Beispiel, wenn Sie machen einen synchronen Netzwerk-Anfrage in der viewDidLoad, die verursachen könnten die Verlangsamung.
- Testen Sie es am simulator in einem Gerät? Die Ergebnisse können variieren extrem zwischen den beiden.
- Wie werden Sie präsentiert Ihre segue? performseguewithidentifier? Wenn ja, haben Sie versucht
dispatch_async(dispatch_get_main_queue(), {performSegueWithIdentifier(mysegueIdentifier, self)})
- ich Teste auf beiden emulieren und Gerät. Auf emulator die Verzögerung erheblich ist, sind auf dem Gerät, etwa 1-2 Sekunden. Wie ich schon erwähnt habe, wenn ich nur ändern Sie den übergang von "modal", "push", es ist instant. Also das problem ist mit "modal" leitet über...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vertrauen Sie mir und versuchen, diese. Ich habe dieses problem schon ein paar mal.
In Swift 2:
oder für Swift 3:
Diskutiert, wie hier und hier.
dispatch_sync(dispatch_get_main_queue(),{<your code>})
hat es die app einfrieren?performSegueWithIdentifier
es passiert auf thread #1. Wenn ich indispatch_async
es nicht einfrieren, aberdispatch_sync
friert.dispatch_async
erschien, das problem zu lösen für mich. Ich kann nicht erklären warum, aber ich bin sicher, ich bin im UI-thread, aber so ist es.didSelectRowAtIndexPath
. Ich habe überprüft der code wurde auf dem Haupt-thread mitassert(NSThread.isMainThread())
. Noch in der Ausgabe beibehalten. Ich kann nicht erklären warum, aber die Verschiebung der "performSegue" Aufruf der nächsten run-loop löst dieses Problem.Scheint es (mir...), dass dieses problem tritt nur auf, wenn die Zelle
selectionType
ist nicht.none
.Können Sie es ändern, um eine andere option (in der storyboard -
Attribute inspector
, legen Sie dieSelection
Feld) und es funktioniert Prima (für mich arbeiten...).Die Nachteile ist, dass es Durcheinander die Zelle UI.
Können Sie rufen Sie die segue in
DispatchQueue.main.async{}
block amdidSelect
delegieren FunktionUITableViewDelegate
wie die Menschen vor erwähnen.Ich die erste Lösung Hinzugefügt und an der Zelle selbst -
Dadurch wird die Zelle 'highlight' am Tippen, aber es wird wieder zu seiner gewohnten Benutzeroberfläche sofort und es gut für mich...
Scheint es verschiedene Situationen, bei Ausführung eines segue wird nicht richtig funktionieren. Zum Beispiel, wenn Sie anrufen
performSegue
von der action-handler für ein unwind segue, Sie führen in verschiedene Themen, obwohl Sie auf dem Haupt-thread. Auf meinem aktuellen Projekt rufe ichperformSegue
von derdidSelectRowAt
Methode einer Tabelle anzeigen. Dies ist eine der grundlegendsten leitet über es und natürlich bin ich auf dem Haupt-thread, doch ich sah die genauen Symptome, die der OP beschrieben.Ich weiß nicht, warum dies passiert in einigen Fällen und nicht andere, aber ich habe festgestellt, dass das zurückstellen der
performSegue
Anruf mitasync
behebt mögliche Probleme. Dies scheint ein hack und machte mich nervös, aber an diesem Punkt habe ich mehrere ausgereifte Projekte mit diesem Ansatz, und es nun scheint, wie der "richtige" Weg, um eine manuelle segue.Hier ist die Swift 3-version des Codes (siehe die anderen Beiträge für Swift 2 und Obj-C-Versionen):
Akzeptierte Lösung für mich gearbeitet. Code aktualisiert für Swift 2.0 unter:
Hoffen, Ihnen helfen diese yo erstellen können programmgesteuert modal-übergangs, wie dies in Swift:
Für Entwickler, die Organisation in Ihrem code durch Unterklassen, ich habe es ganz einfach eine Lösung, die ich teilen möchte, Swift (4):
Dann, nennen Sie es einfach von Ihrer Implementierung ab:
Für mich war es die, die ich hatte zu viele "Klare" colored views in meinem nächsten Blick, so dass, wenn der Wechsel animiert wurde, es schien sich zu verzögern, weil dieser. Ich ging durch den view-controller der UI-Hierarchie nach klaren Farben und ersetzen Sie Sie mit schwarz oder weiß, und sicherstellen, dass die alpha 1 ist (wenn es nicht anders sein). Mein delay ist jetzt verschwunden, und meine modal Präsentation ist glatt.
Ich habe versucht, dies zu beheben mehrere Möglichkeiten, einschließlich, indem Sie in der main-thread oben. Dieser arbeitete für mich:
Im storyboard, wählen Sie die Tabellenansicht in Frage, (wählen Sie es im Dokument Umriss, um sicherzustellen, dass Sie haben die richtige. Dann im Attribute Inspektor, Sie werden in der Lage sein, um die Attribute für die Tabellenansicht sowie die mit scrollview darunter (Tabelle alle Ansichten basieren auf scroll-view). Es ist dieses dumme kleine box namens "delays content touches". Deaktivieren Sie es. Es gibt auch eine "ermöglicht kündbar berührt", die werde ich mir vorstellen, dass Sie wollen, stellen Sie sicher deaktiviert ist, wie ich denke, Doppel berührt eingelassen hatten mir bis.