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

Ios 如何在UIPageViewController中的两个ViewController之间传递数据,ios,swift,uiviewcontroller,uipageviewcontroller,Ios,Swift,Uiviewcontroller,Uipageviewcontroller,我有两个UIViewController,A和B,我在UIPageViewController中连接它们: 下面是它在故事板中的外观: 我不知道如何从A向B传递数据。好吧,假设您有一些类(您应该提供这些类),如: 现在,您需要page view controller的子类,该子类控制数据,以便override view加载以创建模型: var myModel: MyModel! override func viewDidLoad() { super.viewDidLoad()

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

下面是它在故事板中的外观:


我不知道如何从A向B传递数据。

好吧,假设您有一些类(您应该提供这些类),如:

现在,您需要page view controller的子类,该子类控制数据,以便override view加载以创建模型:

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个视图控制器共享同一个模型。这可能是最简单的方法,但有很多方法。最干净的方法可能是使用委托,委托将报告给页面控制器,然后再报告给给定的视图控制器。

我在找到解决方案时遇到了一些困难,我自己使用委托想出了一些办法。欢迎提出建议

在发送数据的ViewController中,定义代理,如下所示:

protocol FirstVCDelegate {  
    func foo(someData: String)  
}  

class FirstViewController: UIViewController {  
    var delegate: FirstVCDelegate?  

    ....  

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

}  
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   
....
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  
    }  
}  
在PageViewController中,按如下方式设置视图控制器:

protocol FirstVCDelegate {  
    func foo(someData: String)  
}  

class FirstViewController: UIViewController {  
    var delegate: FirstVCDelegate?  

    ....  

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

}  
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   
....
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  
    }  
}  
最后,接收ViewController实现委托,如下所示:

protocol FirstVCDelegate {  
    func foo(someData: String)  
}  

class FirstViewController: UIViewController {  
    var delegate: FirstVCDelegate?  

    ....  

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

}  
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   
....
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  
    }  
}  
祝你好运


亚伦

我还有一个问题。如何将A或B的数据传递给UIPageViewController?@JakeTo从我建议的系统中,页面视图控制器已经通过
self.myModel
获得了该数据。如果您需要发回消息,我建议您执行一个委托程序。因此,创建一个类似于MyFirstViewControllerDelegate的
协议
,并添加所需的方法。然后在第一视图控制器中添加一个变量
弱变量委托:MyFirstViewControllerDelegate
,并通过
controller.delegate=self
将页面视图控制器指定为
getFirstViewController
中的委托。。。