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 viewControllers
UIPageViewController 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()
})
}
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
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
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 –
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