【问题标题】:how to pass data from UIPageViewController to child ViewController using delegates如何使用委托将数据从 UIPageViewController 传递到子 ViewController
【发布时间】:2017-05-04 14:43:57
【问题描述】:

我想将数据从UIPageViewController 传递给它的一个子ViewControllers。 我有一个这样的协议集:

protocol Delegate : class{
    func protocolMethod(count:Int)
}

UIPageViewController:

class PageVC : UIPageViewController{
    var delegate : Delegate?
    var count : Int = 1

    func classMethod(){
        self.displayPageForIndex(5) //this controlls the tranistion to the child ViewController 
        self.delegate?.protocolMethod(count : self.count) 
    }
}

在顺从的孩子ViewController:

class ChildVC : UIViewController , Delegate{

    func protocolMethod(count : Int){
        print(count)
    }

    override func viewDidLoad() { 
        super.viewDidLoad()
        let pvc = PageVC()
        pvc.delegate = self
    }
}

我在viewDidLoad 中所做的是我尝试过的最简单的解决方案,但仍然找不到关于如何让PageViewController 知道孩子ViewController 是接收者的答案协议方法。 如果有人可以在不使用 prepareForSegue 的情况下帮助我实现这一点(因为没有 segues),那将不胜感激。

【问题讨论】:

  • 您的ChildVCPageVC 在哪里实例化?另外,我建议您为您的代表指定一个名称,以指定它的作用或用途。
  • 我有一个函数可以实例化子 VC,然后我将它们添加到数组中。 PageVC 本身没有被实例化(好吧,PageViewController 的功能可以完美地工作,所以它的实例化方式可能与子 vcs 不同)。这里的名字只是占位符让我了解应该做什么,我在我的真实代码中使用特定的名字@toddg
  • "PageVC 本身没有被实例化" 显然,关于什么是类和实例,以及如何在 iOS / Cocoa 编程中创建实例,这里存在知识空白。没有什么比这更基本的了:除非了解对象,否则无法进行面向对象编程。

标签: ios swift delegates protocols uipageviewcontroller


【解决方案1】:

问题出在这一行:

    let pvc = PageVC()

这使得一个新的、独立的 PageVC。那不是你想要的。您想要对 现有的、实际的 PageVC 的引用,它的父级是 this。那个参考是self.parent(虽然不是,也许,在viewDidLoad,这是相当早的,可能还不能保证我们是孩子)。

【讨论】:

    【解决方案2】:

    如果您的子视图控制器知道它总是在UIPageViewController 的上下文中,那么您可以使用视图控制器中的父/子链接来允许这些控制器相互发现并交换数据。在这些情况下特别有用的是UIViewController 类参考的响应收容事件部分中的方法。

    如果您想使用协议,那么我会在页面视图控制器上定义协议,并在创建时将该协议传递给子视图控制器。所以:

    protocol MyDataSourceProtocol {
      func gimmeSomeData() -> Data
    }
    
    // The UIPageViewController implements MyDataSourceProtocol because
    // he's going to provide information to his children.
    class PageVC : UIPageViewController, MyDataSourceProtocol {
      func gimmeSomeData() -> Data {
          ...
      }
    
      func makeChildViewControllers() -> ChildViewControllers {
          return childControllerElements.map {
            element : ChildControllerElement in
    
            // pass self to let the child view controller know I'll be his
            // source
            return ChildViewController(self)
          }
      }
    }
    

    然后确保您的子视图控制器知道要获取内容

    class ChildViewController : UIViewController {
      let dataSource : MyDataSourceProtocol
      init(dataSource : MyDataSourceProtocol) {
        self.dataSource = dataSource
      }
    }
    

    最后是一些关于风格的cmets:

    您需要小心使用“委托”一词,因为它在 Cocoa API 的上下文中具有非常特定的含义,而您在此处的使用与该含义不符。用小写字母 (childVC) 命名一个类也很糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 2013-01-20
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多