如何在 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
获得了该数据。如果您需要发回消息,我建议使用委托程序。所以创建一个protocol
像MyFirstViewControllerDelegate
并添加需要的方法。然后在第一个视图控制器中添加一个变量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 中添加两个视图控制器