在Swift 3 iOS中向前游泳时,在UIPageViewController中调用After和Before方法

我用数据源数组做了UIPageViewController,它工作正常。 但是在向前和向后滑动方向转接呼叫时,
我的代码在这里:

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 } 

和孩子vc代码在这里:

 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() } } 

请帮我解决这个问题谢谢。

这不是页面视图控制器的问题。 这是你的关于什么时候viewControllerBeforeviewControllerAfter假设问题。 你的假设似乎是合理的,但是他们是错误的,就像我现在要解释的那样。

例如,假设当我进入第3页,然后开始滑动到第4页, viewControllerAfter被调用第3页,这样就可以提交第4页。这是不正确的。 页面视图控制器的滚动实现使用caching向前滚动更快。 因此,当你刚刚描述的时候,可能是第4页已经被caching了,现在,当滚动结束时 ,PVC将调用第5页的viewControllerAfter ,为了预先caching,以防再次滚动以后同样的方法。 或者,如果这是最后一页,则可能根本没有任何东西被调用。

这种行为意味着你不能对viewControllerBeforeviewControllerAfter被调用的时间或者被调用的页面做任何的假设。 但是,你的代码,使用这些方法中的通知,取决于这样的假设 – 这些假设是错误的,这就是为什么你的代码不工作。 一切似乎都是一个一个的 – 因为它是。

你可以通过依赖你的信号来解决问题,而不是依赖于委托方法willTransitionTodidFinishAnimating (参见UIPageViewControllerDelegate上的文档)。

Interesting Posts