2017-02-13 2 views
0

relativement nouvelle à Xcode/Swift, mais ont une certaine expérience dans d'autres langues.étiquette de mise à jour dans UIPageView

Je suis au stade de l'enfance d'une application et essaie d'atteindre les fonctionnalités suivantes:

Dans un environnement UIPageView, lorsque l'utilisateur fait glisser vers l'avant, l'étiquette (dont la valeur est un nombre entier) augmente de 1. Lorsque l'utilisateur fait défiler vers l'arrière, l'étiquette diminue de 1.

J'ai un seul UIViewController comme page de contenu avec l'ID de table de montage PageContentViewController.

Essentiellement, mes pensées sont à déclarer une variable entière initialement fixé à 0 et puis créer une fonction swipedBack() et swipedRight() qui met à jour la valeur de la variable et définit ensuite le texte de l'étiquette sur la PageContentViewController à la valeur de cette variable . Les fonctions renvoient alors le nouveau PageContentViewController.

Je reçois un comportement particulier. A savoir, l'application est en cours de construction et fonctionne bien.

Les charges de l'écran initial avec une étiquette de 0. Je swipe vers l'avant, et mises à jour 1. mais ... si je balayez vers le avant à nouveau, l'étiquette reste comme l'un. MAIS ALORS ... si je continue d'aller de l'avant, il agit alors comme désiré - passe à 2, puis à 3. Puis, si je change de direction, cela devient encore plus particulier.

Si je suis à une valeur de quatre, puis balayez vers l'arrière, il va diminuer à 3. Mais puis en revenant à nouveau il va revenir à 4, puis en continuant à glisser, il se comportera comme prévu (4,3, 2,1 ...). J'ai évidemment un malentendu conceptuel et j'apprécierais de l'aide.

Voici mon code:

import UIKit 

class ViewController: UIPageViewController, UIPageViewControllerDataSource { 

    var arrPageTitle: NSArray = NSArray() 

    var t: Int = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.dataSource = self 

     self.setViewControllers([getViewControllerAtIndex()] as [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     return swipedBack() 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     return swipedForward() 
    } 

    func getViewControllerAtIndex() -> PageContentViewController { 
     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     pageContentViewController.strTitle = "\(t)" 
     return pageContentViewController 
    } 

    func swipedForward() -> PageContentViewController { 

     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     t = t + 1 

     pageContentViewController.strTitle = "\(t)" 
     return pageContentViewController 

    } 

    func swipedBack() -> PageContentViewController { 

     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     t = t - 1 
     pageContentViewController.strTitle = "\(t)" 
     return pageContentViewController 

    } 

} 

Répondre

1

Je pense que c'est probablement parce que une fois que vous changez de direction, la plus récente UIViewController est encore en mémoire, et donc la fonction de délégué n'est pas appelé.

Je recommande d'utiliser la fonction au lieu pageViewControllerWillTransitionTo. Cela devrait être appelé à chaque fois que vous balayez. De même, vous pouvez utiliser pageViewControllerDidFinishAnimating si vous voulez que l'appel se produise après que vous balayez.

Afin de détecter la direction dans laquelle vous avez glissé, vous pouvez essayer d'utiliser un UISwipeGestureRecognizer en même temps et appeler des fonctions qui vont incrémenter/décrémenter la valeur de la variable. En fait, maintenant que j'y pense, il se peut que vous soyez capable d'utiliser ce module de reconnaissance de gestes sans la fonction de délégué. Dépend de vous.

+0

Merci. J'ai essayé d'implémenter UISwipeGestureRecognizers de base et j'ai essayé d'appeler des fonctions de swipeBack et de swipeForward quand ces balayages se produisent. Mais l'étiquette ne se met pas à jour lorsque je fais glisser le simulateur. '@IBAction func swipeBack (_ expéditeur: UISwipeGestureRecognizer) { t = t-1 lblTitle.text = "Retour passée dans le lecteur" } @IBAction func swipeForward (_ expéditeur: UISwipeGestureRecognizer) { t = t + 1 lblTitle.text = "chipé avant" } ' Ceci est appelé dans le fichier PageContentViewer.Swift –

+0

Pourquoi sont-ils IBActions? Cela peut faire partie du problème. Faites-en simplement des fonctions normales. –

+0

Je les ai créés sur le storyboard? Glisser un objet de reconnaissance de mouvement sur le contrôleur de vue contentPageViewer? Ils génèrent automatiquement avec cette syntaxe ... –