当我将数据从 TableView 传递到 child PageViewController 时,它可以转到下一个 child

When I pass data from TableView to child PageViewController, it can go to next child

我有一个 UIViewController 和一个 UITableView。然后我用两个 viewcontroller 创建一个 PageViewController。如果我将数据传递给 child,Pageview 将不起作用。如果我改变

setViewControllers([subjective], direction: .Forward, animated: true, completion: nil)

setViewControllers([firstVC], direction: .Forward, animated: true, completion: nil)

网页浏览有效,但数据未通过。我对此一无所知。请帮帮我。谢谢

代码工作:

页面浏览控制器class:

import UIKit

class PageVC : UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {

var lblhoten = String()
var lblngaysinh = String()
var lblsodt = String()

lazy var VCArr: [UIViewController] = {
    return [self.VCInstance("ThongTinBNPage2"),
            self.VCInstance("ThongTinBNPage3")]
}()

private func VCInstance(name: String) -> UIViewController {
    return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier(name)
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.dataSource = self
    self.delegate = self
    if let firstVC = VCArr.first {
        let subjective = self.storyboard?.instantiateViewControllerWithIdentifier("ThongTinBNPage2") as! VCSubjective
        subjective.lblhoten = lblhoten
        subjective.lblngaysinh = lblngaysinh
        subjective.lblsodt = lblsodt
        setViewControllers([subjective], direction: .Forward, animated: true, completion: nil)
    }
}

public func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    guard let viewcontrollerindex = VCArr.indexOf(viewController) else {
        return nil
    }

    let previousindex = viewcontrollerindex - 1


    guard previousindex >= 0 else {
        return VCArr.last
    }

    guard VCArr.count > previousindex else {
        return nil
    }

    return VCArr[previousindex]
}

public func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    guard let viewcontrollerindex = VCArr.indexOf(viewController) else {
        return nil
    }

    let nextindex = viewcontrollerindex + 1


    guard nextindex < VCArr.count else {
        return VCArr.first
    }

    guard VCArr.count > nextindex else {
        return nil
    }

    return VCArr[nextindex]
}

public func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return VCArr.count
}

// The selected item reflected in the page indicator.
public func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    guard let firstviewcontroller = viewControllers?.first,
        let firstviewcontrollerindex = VCArr.indexOf(firstviewcontroller) else {
            return 0
    }

    return firstviewcontrollerindex
}

}

VC主观:

import UIKit

class VCSubjective: UIViewController {

@IBOutlet var hoten: UILabel!
@IBOutlet var ngaysinh: UILabel!
@IBOutlet var sodt: UILabel!

var lblhoten = String()
var lblngaysinh = String()
var lblsodt = String()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.        
    hoten.text = lblhoten
    ngaysinh.text = lblngaysinh
    sodt.text = lblsodt
}

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


}

这里的问题是您引用了两个完全不同的对象。

viewDidLoad 中创建 ThongTinBNPage2 viewController,然后将其添加到 pageViewController 的 viewControllers 属性。然而,VCArr 中存储的对象是两个完全不同的viewController。

让我们这样想:

  1. 当调用 viewDidLoad 时,您创建 viewController object #1
  2. 然后将 viewController object #1 分配给 pageViewController 的 viewControllers 对象,使值成为 viewControllers = [object #1]
  3. pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? 中,您引用了 VCArr 对象。在第一次调用 VCArr 时,它懒惰地创建了两个完全不同的视图控制器对象 [object #2, object #3]

要修复此代码,您需要执行以下操作:

if let firstVC = VCArr.first {
    let subjective = firstVC   // DO NOT create different VC here
    subjective.lblhoten = lblhoten
    subjective.lblngaysinh = lblngaysinh
    subjective.lblsodt = lblsodt
    setViewControllers([subjective], direction: .Forward, animated: true, completion: nil)
}