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

Posted

技术标签:

【中文标题】如何在 UIPageViewController 中的两个 ViewController 之间传递数据【英文标题】:How to pass data between two ViewController in UIPageViewController 【发布时间】:2018-06-05 07:51:23 【问题描述】:

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

它在情节提要中的外观如下:

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

【问题讨论】:

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

【讨论】:

我还有一个问题。如何将 A 或 B 的数据传递给 UIPageViewController? @JakeTo 从系统中我建议页面视图控制器已经通过self.myModel 获得了该数据。如果您需要发回消息,我建议使用委托程序。所以创建一个protocolMyFirstViewControllerDelegate 并添加需要的方法。然后在第一个视图控制器中添加一个变量weak var delegate: MyFirstViewControllerDelegate,并将页面视图控制器分配为getFirstViewController 中的委托controller.delegate = self...【参考方案2】:

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

在发送数据的ViewController中,定义一个委托如下:

protocol FirstVCDelegate   
    func foo(someData: String)  
  

class FirstViewController: UIViewController   
    var delegate: FirstVCDelegate?  

    ....  

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

  

在 PageViewController 中按如下方式设置您的视图控制器:

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  
      
  

祝你好运,

亚伦

【讨论】:

以上是关于如何在 UIPageViewController 中的两个 ViewController 之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIPageViewController 中更改页面指示器的背景颜色

如何在 UIPageviewcontroller 中实现静态菜单栏?

如何在视图中移动 UIPageViewController 页面控制器按钮的位置

如何在 UIPageViewcontroller 中添加两个视图控制器

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

iOS - 如何在 UIPageViewController 中设置 UIScrollView 以在重新启用后开始滚动