Как передать данные между двумя ViewController в UIPageViewController - PullRequest
0 голосов
/ 05 июня 2018

У меня есть два UIViewController, A и B, я соединяю их в UIPageViewController:

Вот как это выглядит в раскадровке: image

Я не знаю, какпередать данные в B из A.

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Мне было трудно найти решение, и я сам что-то придумал, используя делегирование.Приветствуются предложения

В 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  
    }  
}  

Удачи,

Аарон

0 голосов
/ 05 июня 2018

Предположим, у вас есть какой-то класс (который вы должны были предоставить), например:

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 контроллера представления совместно используют одну и ту же модель.Это, вероятно, самый простой способ сделать это, но есть очень много способов.Самым чистым, вероятно, являются делегаты, которые отчитываются перед контроллером страницы, который затем отчитывается перед заданными контроллерами представления.

...