如何在UIPageViewController中的两个ViewController之间传递数据

时间:2018-06-05 07:51:23

标签: ios swift uiviewcontroller uipageviewcontroller

我有两个UIViewControllers,A和B,我在UIPageViewController中连接它们:

以下是故事板中的内容: Image

我不知道如何将数据从A传递给B.

2 个答案:

答案 0 :(得分:1)

假设你有一些课程(你应该提供的),比如:

class MyModel {
    var dataFromFirstController: Any?
    var dataFromSecondController: Any?
    var sharedData: Any?
}

现在您需要一个页面视图控制器的子类,它是控制数据的子类,因此覆盖视图会加载以创建模型:

var myModel: MyModel!

override func viewDidLoad() {
    super.viewDidLoad()
    self.myModel = MyModel()
}

现在,当您生成或获取视图控制器时,您只需为它们分配相同的模型:

func getFirstViewController() -> UIViewController {
    let controller = MyFirstController.generate()
    controller.myModel = self.myModel
    return controller
}

func getSecondViewController() -> UIViewController {
    let controller = MySecondController.generate()
    controller.myModel = self.myModel
    return controller
}

现在所有3个视图控制器共享相同的模型。这可能是最简单的方法,但有很多方法。最干净的可能是使用委托,它会向页面控制器报告,然后报告给给定的视图控制器。

答案 1 :(得分:0)

我在寻找解决方案方面遇到了一些困难,并且自己使用委托制作了一些东西。欢迎提出建议

在发送数据的ViewController中,按如下方式定义委托:

protocol FirstVCDelegate {  
    func foo(someData: String)  
}  

class FirstViewController: UIViewController {  
    var delegate: FirstVCDelegate?  

    ....  

    func someMethod() {  
        delegate?.foo("first VC")  
    }  

}  

在PageViewController中设置View Controllers,如下所示:

class PageViewController: UIPageViewController, ... {  
    var myViewControllers = [UIViewController]()  

override func viewDidLoad() {  
    let firstVC = storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController  
    let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController  

    firstVC.delegate = secondVC  

     myViewControllers.append(firstVC)  
     myViewControllers.append(secondVC)  

}  

// MARK: - PageVC Delegate / Datasource   
....

最后,接收ViewController按如下方式实现委托:

class SecondViewController: UIViewController, FirstVCDelegate {  

....  

    func foo(data: String) { // This method is triggered from FirstViewController's delegate?.foo("first VC")  
        print(data)  // "first VC" will be printed  
    }  
}  
祝你好运,

亚伦