2017-01-21 2 views
0

ich die UIPageViewController für eine bin mit auf Internate/tutorial-Bildschirm, und mein Problem ist, wie folgt:segue von Onboarding/tutorial Bildschirm

Wenn der Benutzer auf der letzten Seite des Tutorials ist, möchte ich eine linke Swipe-Geste, um nicht den Seiten-Controller zu wischen, sondern stattdessen einen Übergang zur Registrierungsseite durchzuführen. Ich warf eine Druckanweisung in die viewDidLoad in der UIViewController für die letzte Seite des Tutorials, und es registriert.

In der gleichen viewDidLoad ich meine Gesten erstellen, um die Überleitung durchzuführen, aber nichts passiert. Ich habe sogar versucht, die performSegue innerhalb der ViewDidLoad, aber nichts passiert. Ich habe mein Segment an die UIPageViewController sowie meine GrowController angeschlossen, und keiner registriert. Ich bin ratlos!

Dies ist die UIViewController für die letzte Seite des Tutorials

class GrowController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    print("*********************************") 
    createGesture() 
    // performSegue(withIdentifier: "ShowRegister", sender: self) 
} 


func createGesture() { 
    let showReg = UISwipeGestureRecognizer(target: self, action: #selector(showRegister)) 
    showReg.direction = .left 
    view.addGestureRecognizer(showReg) 
} 


func showRegister(gesture: UISwipeGestureRecognizer) { 
    performSegue(withIdentifier: "showRegister", sender: self) 
} 

} 

Dies ist die UIPageViewController ist, der die

Tutorial Logik behandelt
class TutorialViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { 

    var viewControllerIndex: Int? 

lazy var tutorialArray: [UIViewController] = { 
    return [self.tutorialInstance(name: "page1"), self.tutorialInstance(name: "page2"), self.tutorialInstance(name: "page3")] 
}() 


private func tutorialInstance(name: String?) -> UIViewController { 
    return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name!) 
} 



override func viewDidLoad() { 
    super.viewDidLoad() 
    if let image = UIImage(named: "export.png") { 
     view.backgroundColor = UIColor.init(patternImage: image) 
    } else { 
     print("Error") 
    } 

    self.dataSource = self 
    self.delegate = self 

    if let firstViewController = tutorialArray.first { 
     setViewControllers([firstViewController], direction: .forward, animated: false, completion: nil) 
    } 
} 

Dies sind die delgate und Datenquelle Funktionen

// Page View Controller delegate functions 
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
    guard let viewControllerIndex = tutorialArray.index(of: viewController) else { 
     return nil 
    } 

    let previousIndex = viewControllerIndex - 1 

    guard previousIndex >= 0 else { 
      return nil 
    } 

    guard tutorialArray.count > previousIndex else { 
     performSegue(withIdentifier: "ShowRegister", sender: self) // Added this line just testng around, nothing happend here though. 
     return nil 
    } 

    return tutorialArray[previousIndex] 
} 


public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
    guard let viewControllerIndex = tutorialArray.index(of: viewController) else { 
     return nil 
    } 

    let nextIndex = viewControllerIndex + 1 

    guard nextIndex < tutorialArray.count else { 
     return nil 
    } 

    guard tutorialArray.count > nextIndex else { 
     return nil 
    } 

    return tutorialArray[nextIndex] 
} 

public func presentationCount(for pageViewController: UIPageViewController) -> Int { 
    return tutorialArray.count 
} 

public func presentationIndex(for pageViewController: UIPageViewController) -> Int { 
    guard let firstViewController = viewControllers?.first, let firstViewControllerIndex = tutorialArray.index(of: firstViewController) else { 
     return 0 
    } 
    return firstViewControllerIndex 
} 

Viel Code für was ist wahrscheinlich ein si mple Antwort.

tl; dr - Wie kann ich eine Streichgeste eine segue von einer bestimmten Seite der die Mühe UIPageViewController

Antwort

0

Es gibt eine delegierte Methode, die Sie pageViewController(_:willTransitionTo:) implementieren können, aber ich weiß nicht, dass sein Wert ausführen machen . Stellen Sie vielleicht einfach eine andere Ansicht davor und legen Sie eine Wischgesten-Erkennungsansicht in diese Ansicht und verwenden Sie die erkannte Geste, um die Seite oder den Übergang zum neuen Controller manuell zu ändern.

+0

Ahhh danke, willTransitionTo: wird es wahrscheinlich für mich tun! Aber ich möchte es wie oben erwähnt versuchen, indem ich eine Ansicht oben hinzufüge - ich habe eine Unteransicht in meinen GrowController hinzugefügt, um die gesamte Ansicht abzudecken und die Geste hinzugefügt, aber jetzt, sobald ich zum GrowController wische, stürzt die App ab . Werde bald ein Bild von Fehlern posten, wenn ich meinen Code wieder ansehe – Dan

+0

Hier ist mein Fehler [Fehler] (https://i.imgsafe.org/44128d39bf.png). und ich hinzugefügt '@IBOutlet schwache var swipeView: UIView!' Zu meinem Code, und es stürzt beim Laden ab. – Dan

+0

Ihr Fehler besagt, dass die Klasse nicht Schlüsselwert-konform für swipeView ist. Dies ist fast immer das Ergebnis des Löschens einer Steckdose im Code, aber nicht im Storyboard. Klicken Sie mit der rechten Maustaste auf das Controller-Symbol für die gelbe Ansicht im Storyboard und es werden alle Ausgänge angezeigt. Die Steckdose mit dem gelben Dreieck ist diejenige, die keine entsprechende Steckdose in der Blicksteuerung hat; Lösche es. –