2017-02-03 2 views
-1

J'ai créé UIPageViewController avec un tableau de sources de données et cela fonctionne correctement. Mais lorsque vous passez à droite pour le transfert, appelez les méthodes After et Before.
Mes codes est ici:Appel de la méthode After et Before dans UIPageViewController lors de la poursuite de Swift 3 iOS

import UIKit 

class MainPageViewController: UIPageViewController,UIPageViewControllerDataSource { 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.dataSource = self 
initUPageVC(idx:0,isAnimate:false,direction: UIPageViewControllerNavigationDirection.forward) 
} 
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 
{ 

    //PRIVIOUS 
    let pageContent: MainPageContentViewController = viewController as! MainPageContentViewController 

    var index = pageContent.index 

    if ((index == 0) || (index == NSNotFound)) 
    { 
     return nil 
    } 

    index -= 1; 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateMenuBarItemSelectedNotif"), object: index) 

    return getViewControllerAtIndex(index) 
} 

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

    //NEXT 
    let pageContent: MainPageContentViewController = viewController as! MainPageContentViewController 

    print("now n",pageContent.index) 

    var index = pageContent.index 

    if (index == NSNotFound) 
    { 
     return nil; 
    } 

    index += 1; 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateMenuBarItemSelectedNotif"), object: index) 

    return getViewControllerAtIndex(index) 
} 
func getViewControllerAtIndex(_ index: Int) -> MainPageContentViewController 
{ 
    // Create a new view controller and pass suitable data. 

    let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "MainPageContentVCID") as! MainPageContentViewController 

    destinationVC.index = index 


    return destinationVC 
} 
func initUPageVC(idx:Int,isAnimate:Bool,direction:UIPageViewControllerNavigationDirection) { 

    self.setViewControllers(
     [getViewControllerAtIndex(idx)], 
     direction: direction, 
     animated: isAnimate, completion: nil) 

    let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "MainPageContentVCID") as! MainPageContentViewController 

    destinationVC.index = idx 

} 

et enfant Code vc ici:

import UIKit 

class MainPageContentViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 

@IBOutlet var tableView: UITableView! 
var dataSource : Array<Item>! 
var index:Int = 0 
var myStr:String! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.register(UINib(nibName: "ItemCellNib", bundle: nil), forCellReuseIdentifier: "ItemCellIdentifier") 

    prepareData() 

} 
//MARK: Table View 
func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return dataSource.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCellIdentifier", for: indexPath) as! ItemTableViewCell 

    let obj = dataSource[indexPath.row] 

    cell.itemImage.image = UIImage(named:obj.imageName) 




    cell.selectionStyle = UITableViewCellSelectionStyle.none 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let obj = dataSource[indexPath.row] 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "itemHasClickedNotif"), object: obj) 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 197 
} 

func prepareData(){ 
    let obj0 = Item() 
    let obj1 = Item() 
    let obj2 = Item() 
    let obj3 = Item() 

    if index == 0 { 

    obj0.ID = 0 
    obj0.imageName = "dog" 

    obj1.ID = 1 
    obj1.imageName = "dog" 

    obj2.ID = 2 
    obj2.imageName = "dog" 

    obj3.ID = 3 
    obj3.imageName = "dog" 

}else if index==1{ 

obj0.ID = 0 
obj0.imageName = "cat" 

obj1.ID = 1 
obj1.imageName = "cat" 

obj2.ID = 2 
obj2.imageName = "cat" 

obj3.ID = 3 
obj3.imageName = "cat" 
}else{ 
obj0.ID = 0 
obj0.imageName = "lion" 

obj1.ID = 1 
obj1.imageName = "lion" 


obj2.ID = 2 
obj2.imageName = "lion" 


obj3.ID = 3 
obj3.imageName = "lion" 

} 


    dataSource = [obj0,obj1,obj2,obj3] 

    tableView.setContentOffset(CGPoint.zero, animated: false) 

    tableView.reloadData() 
} 
} 

S'il vous plaît aidez-moi à résoudre ce problème Merci.

Répondre

3

Ce n'est pas un problème avec le contrôleur de page vue. C'est un problème avec vos hypothèses sur quand viewControllerBefore et viewControllerAfter. Vos hypothèses semblent raisonnables, mais elles sont fausses, comme je vais maintenant l'expliquer. Vous supposez, par exemple, que lorsque je suis dans la page 3 et que je commence à glisser vers la page 4, viewControllerAfter est appelé pour la page 3 afin que vous puissiez soumettre la page 4. Cela n'est pas vrai. L'implémentation par défilement du contrôleur de vue de page utilise la mise en cache et lookahead pour accélérer le défilement. Ainsi, lorsque vous faites ce que je viens de décrire, il se peut que la page 4 ait déjà été mise en cache, et maintenant, lorsque le parchemin se termine, le PVC appellera viewControllerAfter pour la page 5, afin de le pré-mettre en cache au cas où vous faites défiler à nouveau de la même manière plus tard. Ou, si c'est la dernière page, il se peut que rien ne soit appelé du tout.

Ce comportement signifie que vous ne pouvez pas faire des hypothèses sur quandviewControllerBefore et viewControllerAfter sont appelés ou pour quelle page ils sont appelés. Mais votre code, avec votre utilisation des notifications dans ces méthodes, dépend de ces hypothèses - et ces hypothèses sont fausses, et c'est pourquoi votre code ne fonctionne pas. Tout semble vous être hors-de-un - parce que c'est.

Vous pourriez être en mesure de résoudre le problème en se basant pour vos signaux plutôt sur le délégué méthodes willTransitionTo et didFinishAnimating (voir la documentation sur UIPageViewControllerDelegate).

+0

Si ma réponse est correcte et vous a aidé, veuillez l'accepter (coche). – matt