2017-02-28 2 views
0

J'ai un UIPageViewController qui gère un tableau de viewControllers lorsque je me glisse entre eux tout va bien, mais j'ai quelques méthodes (après la connexion réussie et après le clic du bouton de menu) qui déclenchent un ' sauter à viewController dans le tableau UIPageViewControllers. chaque fois que je saute sur une page, la transition n'est pas complète et j'ai un écran qui est « coincé » entre deux viewControllersUIPageViewController ne pas terminer la transition sur le bouton cliquez

Pour simplifier, j'ajouter que le code de connexion réussie, parce que je mets tout de même pour bouton clique, et la même chose arrive.

C'est ma configuration UIPageViewController:

import UIKit 

class PageViewController: UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate , ClubViewControllerDelegate , CustomSvDelegate{ 

//clubvcdelegate protocol method 

func fbLoggedInWithSuccess(){ 
self.displayPageForIndex(index: 4, animated: false) 
} 

//menubuttondelegate protocol method 
func menuButtonPressed0() { 

    self.displayPageForIndex(index: 0, animated: false) 
    self.currentPageIndex = 0 
    self.closeMenu() 
} 

//page swipe control 

lazy var vcArray : [UIViewController] = { 
    return [self.vcInstance (name : "clubVC"), 
      self.vcInstance (name : "menuVC"), 
      self.vcInstance (name : "contactVC"), 
      self.vcInstance (name : "aboutVC"), 
      self.vcInstance (name : "membersVC")] 
    }() 

private func vcInstance(name : String) -> UIViewController{ 
    let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
    return storyBoard.instantiateViewController(withIdentifier: name) 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 
    self.dataSource = self 
    self.delegate = self 
    if let clubVC = vcArray.first { 
     let club = clubVC as! ClubViewController 
     club.delegate = self 
     setViewControllers([clubVC], direction: .forward, animated: true, completion: nil) 
    } 
    self.generateStackView() 
} 


override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    for view in self.view.subviews { 
     if view is UIScrollView {view.frame = UIScreen.main.bounds} else if view is UIPageControl {view.backgroundColor = UIColor.clear} 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

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

    let previousIndex = viewControllerIndex - 1 

    guard previousIndex >= 0 else {return vcArray.last} 

    guard vcArray.count > previousIndex else {return nil} 

    return vcArray[previousIndex] 

} 


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

    let nextIndex = viewControllerIndex + 1 

    guard nextIndex < vcArray.count else {return vcArray.first} 

    guard vcArray.count > nextIndex else {return nil} 

    return vcArray[nextIndex] 

} 

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


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

et voilà comment je mis en place des choses où fblogin réussit:

protocol ClubViewControllerDelegate:class { 
func fbLoggedInWithSuccess() 
} 

class ClubViewController: UIViewController , FBSDKLoginButtonDelegate { 
var delegate:ClubViewControllerDelegate? 

func showFbDetails(){ 

    let accesToken = FBSDKAccessToken.current() 

    guard let accesTokenString = accesToken?.tokenString else {return} 

    let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accesTokenString) 

    FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in 
     if error != nil { 
      print ("something went wrong" , error!) 
      return 
     } 
     print ("succes") 
     self.delegate?.fbLoggedInWithSuccess() 
    }) 

} 

Photos: enter image description here enter image description here

EDIT2 Cela ne se produit lorsque animé vrai, quand faux, il termine correctement

EDIT3 Ceci est la méthode que je l'utilise maintenant pour définir les contrôleurs de vue:

func displayPageForIndex(index : Int , animated : Bool = true){ 
    assert(index >= 0 && index < self.vcArray.count, "Error: Attempting to display a page for an out of bounds index") 
    if self.currentPageIndex == index {return} 
    if index < self.currentPageIndex { 
     self.setViewControllers([self.vcArray[index]], direction: .reverse, animated: false, completion: nil) 
    } else if index > self.currentPageIndex { 
     self.setViewControllers([self.vcArray[index]], direction: .forward, animated: false, completion: nil) 
    } 
} 

Je l'appelle à l'intérieur de fbLoggenInWithSuccess et menuButtonPressed. En outre, ont une Currentlndex variable qui contient l'index actuel de la page

+0

Expliquer le but de votre code, s'il vous plaît. Pourquoi appelez-vous 'setViewControllers' deux fois? À quoi sert le moi faible 'pvcw'? À quoi sert le 'async'? – matt

+0

Je ne l'utilise plus réellement. Mais ce que j'essaye de faire est de sauter à un nouveau viewController quand la connexion est réussie/après le clic du bouton. Si je comprends bien, setviewcontrollers est mon seul moyen de changer le viewController actuel @matt –

+0

Correct, mais le code que vous avez montré est très étrange et je me demande pourquoi vous le faites et si cela peut être à l'origine du problème. Je peux seulement continuer avec le code que vous dites que vous utilisez, et vous dites que c'est le code que vous utilisez. Étiez-vous juste en train de mentir quand vous avez dit ça? Si oui, pourquoi? Montrez votre code _real_ si ce n'est pas le vrai code. Impossible de reproduire le problème ou de deviner sa cause sans connaître le code réel. – matt

Répondre

0

Comme Matt a suggéré de supprimer viewDidLayoutSubviews tranché la question

+1

Content que vous l'ayez trouvé! L'habitude est de mettre un drapeau de propriété pour que votre code de personnalisation soit exécuté juste la première fois que les sous-vues sont disposées et ensuite plus jamais. - Ma critique sur le tableau des contrôleurs de vue est toujours là. C'est un mauvais comportement. – matt

+0

je vais lire à ce sujet et changer en conséquence, merci! –