2017-05-04 43 views
-1

我想将UIPageViewController中的数据传递给其子ViewControllers之一。 我有一个协议设置像这样:如何将数据从UIPageViewController传递给使用委托的子ViewController

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),将非常感激。

+0

你的'ChildVC'和'PageVC'被实例化了吗?另外,我会建议为您的代理指定一个名称,以指定它的用途或用途。 – toddg

+0

我有一个函数实例化子VC,然后我将它们添加到数组。 PageVC本身没有实例化(当然,PageViewController的功能完美,所以也许它的实例化方式与子VCS不同)。这里的名字只是占位符,让我知道应该做什么,我在我的真实代码中使用了特定的名字@toddg –

+0

“PageVC本身没有实例化”显然,这里有关于什么类和实例的知识缺口是,以及如何在iOS/Cocoa编程中创建实例。没有什么更基本的东西了:除非知道对象,否则不能进行面向对象的编程。 – matt

回答

0

如果您的子视图控制器知道它总是在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 
    } 
} 

最后一些意见上的风格:

你要小心术语“委托“,因为它在Cocoa API的上下文中具有非常具体的含义,您在这里的使用与此含义不符。用小写字母命名一个类(childVC)也是不好的风格。

1

的问题是这一行:

let pvc = PageVC() 

,使一个新的,单独 PageVC。这不是你想要的。您希望参考现有的,实际的 PageVC,其父母是。该参考文献是self.parent(虽然不是,也许在viewDidLoad,这是相当早,可能不能保证我们还是孩子)。

相关问题