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

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

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

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

【问题讨论】:

    标签: ios swift uiviewcontroller uipageviewcontroller


    【解决方案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  
        }  
    }  
    

    祝你好运,

    亚伦

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多