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

rez*_*afi -1 containers swipe ios uipageviewcontroller swift3

我用数据源数组制作了UIPageViewController,它运行正常.但是当向右滑动转发时,请调用After和Before方法.
我的代码在这里:

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

}  
Run Code Online (Sandbox Code Playgroud)

和儿童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()
}
}  
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 8

页面视图控制器不是问题.关于何时viewControllerBeforeviewControllerAfter被调用的假设是一个问题.你的假设似乎是合理的,但它们是错的,正如我现在要解释的那样.

例如,您假设当我在第3页并且我开始向第4页滑动时,viewControllerAfter会调用第3页,以便您可以提交第4页.但事实并非如此.页面视图控制器的滚动实现使用缓存前瞻来更快地滚动.因此,当你执行我刚刚描述的操作时,可能是第4页已经被缓存,现在,当滚动结束时,PVC将调用viewControllerAfter第5页,以便在您再次滚动时预先缓存它同样的方式.或者,如果这是最后一页,则可能根本不会调用任何内容.

此行为意味着你不能做出任何假设时, viewControllerBeforeviewControllerAfter被称为或什么页面,他们被称为.但是你的代码,在这些方法中使用通知,取决于这些假设 - 而且这些假设是错误的,这就是你的代码无效的原因.在你看来,所有东西都是一个接一个的 - 因为它是.

你也许可以依靠你的信号,而不是在解决问题的委托方法willTransitionTodidFinishAnimating(见UIPageViewControllerDelegate的文档).