2017-10-17 2 views
0

Ich habe zwei viewControllers, beide sind Teil einer UINavigationController. Von View1 kann ich eine UITableViewCell tippen und gehen Sie zu View2, von View2 kann ich zurück zu View1 wischen.Get Fortschritt von UINavigationController Swipe zurück

Ich würde gerne wissen, wie ich den Fortschritt dieses Übergangs zu bekommen, und ich, waren nicht erfolgreich mit den folgenden:

override func viewDidAppear(_ animated: Bool) { 
    navigationController?.interactivePopGestureRecognizer?.addTarget(self, action: #selector(going)) 
} 
@objc func going(){ 
     print(self.transitionCoordinator?.percentComplete) 
} 

Das going Funktion viel beim Übergang genannt wird, sondern dass print-Anweisung druckt einfach nil. Ich habe mit anderen View-Controller (beide View1 und der übergeordneten Nav-Controller) vergeblich versucht.

Vielen Dank im Voraus

+1

Vielleicht navigationController ?. transitionCoordinator ... –

+0

Das druckt ein Optional (0.0), am Anfang und dann Null nach – Will

Antwort

3

Dies ist, was zu funktionieren scheint: wenn

private var currentTransitionCoordinator: UIViewControllerTransitionCoordinator? 

    @objc private func onGesture(sender: UIGestureRecognizer) { 
     switch sender.state { 
     case .began, .changed: 
      if let ct = navigationController?.transitionCoordinator { 
       currentTransitionCoordinator = ct 
      } 
     case .cancelled, .ended: 
      currentTransitionCoordinator = nil 
     case .possible, .failed: 
      break 
     } 

     if let currentTransitionCoordinator = currentTransitionCoordinator { 
      print(currentTransitionCoordinator.percentComplete) 
     } 

    } 

Nachdem Sie dort gehen lassen keine Möglichkeit, Fortschritte zu bekommen ist. Ich habe versucht, den Koordinator ein wenig länger zu behalten und Werte auf Timer zu drucken, aber ich bekomme sogar einen Crash.

Wie auch immer, ich nehme an, das ist was Sie brauchen.

TEST SZENARIO:

ein neues Projekt erstellen und zum Hauptstoryboard navigieren. Fügen Sie einen Navigationscontroller hinzu und legen Sie den Stammansicht-Controller im Storyboard auf ViewController fest (entfernen Sie das automatisch generierte Stammverzeichnis).

Dann ViewController.swift gehen und überschreiben Sie mit folgenden:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     if let controller = navigationController, controller.viewControllers.count <= 1 { // Present it first time only 
      view.backgroundColor = UIColor.green 
      let newController = ViewController() 
      newController.view.backgroundColor = UIColor.red 
      navigationController?.interactivePopGestureRecognizer?.addTarget(newController, action: #selector(onGesture)) 
      navigationController?.pushViewController(newController, animated: true) 
     } 
    } 

    private var currentTransitionCoordinator: UIViewControllerTransitionCoordinator? 

    @objc private func onGesture(sender: UIGestureRecognizer) { 
     switch sender.state { 
     case .began, .changed: 
      if let ct = navigationController?.transitionCoordinator { 
       currentTransitionCoordinator = ct 
      } 
     case .cancelled, .ended: 
      currentTransitionCoordinator = nil 
     case .possible, .failed: 
      break 
     } 

     if let currentTransitionCoordinator = currentTransitionCoordinator { 
      print(currentTransitionCoordinator.percentComplete) 
     } 

    } 

} 

Sie sollten Prozentsatz, wie Sie Ihren Finger ziehen ausgedruckt sehen können, zur Zeit gedrückt View-Controller abgewiesen.

+0

Vielen Dank, aber der Fortschritt wird nie für mich gedruckt – Will

+0

@Will Stellen Sie sicher, dass Sie die richtige Methode zur Gestenerkennung hinzufügen. Ich habe seinen Namen geändert. –

+0

@Will Überprüfen Sie meine Bearbeitung, um ein Testszenario zu generieren. –

Verwandte Themen