我有两个UIViewControllers,A和B,我在UIPageViewController中连接它们:
以下是故事板中的内容:
我不知道如何将数据从A传递给B.
答案 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
}
}
祝你好运,
亚伦